免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6179 | 回复: 9
打印 上一主题 下一主题

虚心求教关于LINUX 共享内存和信号量,自己写的例子怎么产生死锁,求教大侠谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-19 14:48 |只看该作者 |倒序浏览
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>       
#include <errno.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/sem.h>
      
#define INITDAEMON {\
         if(fork()>0) exit(0); \
         setsid(); \
         if(fork()>0) exit(0); \         
}
#define SIZE (64*sizeof(char))
extern int errno;

int main(int argc , char *argv[])
{
        //INITDAEMON;
       
        int fd;
        char* shmptr;
        pid_t pid1;
        int status;
        struct sembuf P,V;
        //union semun arg;
        int mutxid;
       
        if((fd = open("./t" , O_CREAT|O_TRUNC|O_RDWR , 00700)) < 0)
        {
                printf("%d %s\n" , __LINE__ ,strerror(errno));
                return -1;
        }

        if(lseek(fd , SIZE , SEEK_SET) < 0)
        {
                printf("%d %s\n" , __LINE__ ,strerror(errno));
                return -1;
        }
        write(fd , "" , 1);
        if((shmptr =(char *) mmap(NULL , SIZE ,PROT_WRITE|PROT_READ|PROT_EXEC \
                                                        , MAP_SHARED , fd , 0)) == (void *)-1)
        {
                printf("%d %s\n" , __LINE__ , strerror(errno));
                return -1;               
        }
        memcpy(shmptr , "hellow world!" , sizeof("hello world!"));

        if((mutxid = semget(IPC_PRIVATE , 1 , IPC_CREAT|00666)) == -1 )
        {
                printf("%d %s\n" , __LINE__ , strerror(errno));
                return -1;                       
        }
    P.sem_num=0;
    P.sem_op =-1;
    P.sem_flg=SEM_UNDO;

    V.sem_num=0;
    V.sem_op =-1;
    V.sem_flg=SEM_UNDO;
   
        if(semctl(mutxid , 0 ,SETVAL , 1) == -1) //初始化信号灯
                perror("setctl setval error");               
       
        if((pid1 = fork()) < 0)
        {
                printf("%d %s\n" , __LINE__ , strerror(errno));
                return -1;
        }
        else if(pid1 == 0)
        {
                printf("child pid is %d:\n",getpid());
                printf("child from shm :\t %s\n", shmptr);
                semop(mutxid , &P ,1 );
                memset(shmptr , 0 , SIZE);
                memcpy(shmptr , "hellow zjx!" , SIZE);       
                semop(mutxid , &V , 1);
                exit(0);
        }
        else
        {
                printf("father pid is: %d\n",getpid());
                //semop(mutxid , &P ,1 );
                //memset(shmptr , 0 , sizeof(shmptr));
                //memcpy(shmptr , "hellow Tian!" , sizeof("hello Tian!"));               
                //semop(mutxid , &V , 1);

                waitpid(pid1 , &status);
                semop(mutxid , &P ,1 );
                memset(shmptr , 0 , sizeof(shmptr));
                memcpy(shmptr , "hellow Tian!" , sizeof("hello Tian!"));               
                semop(mutxid , &V , 1);

                printf("father from shm: \t %s\n", shmptr);                               
                munmap(shmptr, SIZE);
                semctl(mutxid,0,IPC_RMID);
                return 0;
        }
}

根据操作系统原理操作系统的信号灯是有限的,但是程序退出后用ipcs还是能查到,怎么没有自动释放?头次搞IPC请教前辈
RH linux 9 gcc3.2.2

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-03-19 15:07 |只看该作者
因为信号量可能会在进程间使用,
所以需要你自己清除,系统不会给你清除的。

论坛徽章:
0
3 [报告]
发表于 2007-03-19 15:23 |只看该作者
可是还是产生死锁了?

论坛徽章:
0
4 [报告]
发表于 2007-03-19 16:16 |只看该作者
血的教训是不要用SYS V的信号量同步 POSIX 共享内存。。。。。。兄弟们,犯了个三级错误。

论坛徽章:
0
5 [报告]
发表于 2007-03-19 19:10 |只看该作者
pthread_mutex_lock/unlock()
pthread_cond_signal/wait()

论坛徽章:
0
6 [报告]
发表于 2007-03-19 19:22 |只看该作者
呵呵,找到错误了,,,p v 操作 p操作写错了,,写了个P.sem_op =-1; 难怪死锁 证明是可以用sysv 信号量同步mmap,不过posix 信号好像真的不行

论坛徽章:
0
7 [报告]
发表于 2007-03-20 10:17 |只看该作者
posix不行?第一次听说。

不过posix信号是用于多线程同步的

论坛徽章:
0
8 [报告]
发表于 2007-03-20 11:54 |只看该作者
posix的确不能同步进程间

论坛徽章:
0
9 [报告]
发表于 2007-07-25 10:34 |只看该作者
P.sem_num=0;
    P.sem_op =-1;
    P.sem_flg=SEM_UNDO;

    V.sem_num=0;
    V.sem_op =-1;
    V.sem_flg=SEM_UNDO;

P是加一哇

论坛徽章:
0
10 [报告]
发表于 2007-07-25 13:33 |只看该作者
P操作减一,V操作加一。
不过楼主一开始的semctl也调用错了,最后一个参数错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP