免费注册 查看新帖 |

Chinaunix

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

多进程通信下的共享内存应用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-21 20:43 |只看该作者 |倒序浏览
多进程通信下的共享内存应用问题想向大家请教!
部分代码如下:
*************************
nt main (int argc,char ** argv)
{
        .......................
       
        act_SIGUSR1.sa_handler=&SIGUSR1_hand;
        sigemptyset(&act_SIGUSR1.sa_mask);
        act_SIGUSR1.sa_flags=0;
        sigaction(SIGUSR1,&act_SIGUSR1,NULL);

        act_SIGUSR2.sa_handler=&SIGUSR2_hand;
        sigemptyset(&act_SIGUSR2.sa_mask);
        act_SIGUSR2.sa_flags=0;
        sigaction(SIGUSR2,&act_SIGUSR2,NULL);

        ............................
        result=INIT_Daemon();       
               
        result=CREATE_Daemon();
    .............................
    }

    int INIT_Daemon(void)
{       
     //store the parent ID
        pid_parent=getpid();
       
        //initialize the IPC sem
        if((semid=semget(IPC_PRIVATE,2,777|IPC_CREAT))==-1)
        {
     .......................................                 
        }
        init_semaphore_struct(&sem0wait,0,-1,SEM_UNDO);
        init_semaphore_struct(&sem0signal,0,1,SEM_UNDO);
        init_semaphore_struct(&sem1wait,1,-1,SEM_UNDO);
        init_semaphore_struct(&sem1signal,1,1,SEM_UNDO);
       
        if((semop(semid,&sem0signal,1)||semop(semid,&sem1signal,1))==-1)
        {
        ........................................
        }
       
        //initialize the IPC share memory
        if ((shmid=shmget(IPC_PRIVATE,MEMSIZE+4,777|IPC_CREAT))==-1)
        {
                .....................................
        }

    ............................................
}
    int  CREATE_Daemon(void)
{
        ........................

                        usleep(500000);
                        setsid();
                        chdir ("/");
                        umask(0);
                        for (i=0;i<3;++i)
                        {
                                close(i);
                       
                        }
                                     
                        if((int)(memory_header=shmat(shmid,0,0))==-1)
                        {
                                kill(pid_parent,SIGUSR2);
                                exit(1);
                        }
                        ................................
                       
                        //register the signal handle function
                        struct sigaction act_SIGUSR1;
                        act_SIGUSR1.sa_handler=&m_handle;
                        sigemptyset(&act_SIGUSR1.sa_mask);
                        act_SIGUSR1.sa_flags=0;
                        sigaction(SIGUSR1,&act_SIGUSR1,NULL);
                       
       
                        while(1)
                        {
                       
                        while((semflag=semop(semid,&sem0wait,1))==-1&&errno==EINTR);//wait the sem
                               
              .................................
                               
                        while((semflag=semop(semid,&sem0signal,1))==-1&&errno==EINTR);//release the sem
                       
              .................................       
        }       
}
******************************************************
      上面便是,我看的代码的主要部分。它是通过 CREATE_Daemon()函数创建一个精灵进程,而父进程仍然往后执行。
让我困惑的就是,在CREATE_Daemon函数中,它又重新声明了act_SIGUSR1信号,而且名字和main函数中相同,只是信号处理函数不一样。如果fork后,子程序会重新从main函数开始运行,在main中,act_SIGUSR1信号会被声明,而,act_SIGUSR1信号在CREATE_Daemon函数中也会同样声明,合理吗?(这样不是有两次声明了!)在此,我想到另外一个问题,这两个进程如何能进行共享内存的实现(当然它们是靠信号灯同步的),因为子进程从main函数处,又会重新申请新的共享内存,而且信号灯也是在两个进程都声明了,这样不就是两个变量了,这能实现ipc吗?

可能我对fork还不是很熟悉,希望大家指点!

论坛徽章:
0
2 [报告]
发表于 2006-12-22 10:04 |只看该作者
怎么,没有兄弟回复啊

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
3 [报告]
发表于 2006-12-22 10:23 |只看该作者
fork后如果从头执行,那叫两条,不是叉子
改一下(觉得下面的对仗工整)::em11:
fork后如果从头执行,那叫筷子,不是叉子

[ 本帖最后由 r2007 于 2006-12-22 10:25 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP