免费注册 查看新帖 |

Chinaunix

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

:oops: 多进程的信号处理遇到的问题,再现等待!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-23 12:11 |只看该作者 |倒序浏览
我在linux下写的程序,目的是当按下中断键时,父进程给子进程发出信号,子进程打印结束语句,结束运行。然后父进程回到中断点继续运行。但结果为什么和我想的不一样。

另外,如果我不用按中断键的方式触发信号,那么如何保证父进程一定是在子进程已经初始化了sigaction(SIGUSR1, &cact, NULL);后,对子进程进行信号触发。

请各位高手,多多指教!!!小妹在此多些了!!


#include<stdio.h>;
#include<stdlib.h>;
#include<string.h>;
#include<unistd.h>;
#include<signal.h>;
#include<sys/types.h>;

pid_t pid, ppid;

void p_action(int sig)
{
printf("\nparent caught signal";
sleep(1);
kill(pid,SIGUSR1);
}

void c_action(int sig)
{
printf("\nchild caught signal";
exit();

}


main()
{
  void p_action(int), c_action(int);
  static struct sigaction pact, cact;
  
  pact.sa_handler=p_action;
  sigfillset(&(pact.sa_mask));
  sigaction(SIGINT, &pact, NULL);

  switch(pid=fork())
  {
    case -1: {
             perror("synchro";
             exit(1);
                }   
    case 0: {
            cact.sa_handler=c_action;
            sigaction(SIGUSR1, &cact, NULL);
            ppid=getppid();
            sleep(5);
            printf("\nchild process1";

            sleep(5);
            printf("\nhild process2";

            sleep(5);
            printf("\nchild process3";

            sleep(5);
            printf("\nchild process4";
            
            exit(0);

          }
    default: {
            sleep(5);
            printf("\nparent process1";

            sleep(5);
            printf("\nparent process2";

            sleep(5);
            printf("\nparent process3";

            sleep(5);
            printf("\nparent process4");

            sleep(5);
            printf("\nparent process5");

                     
            exit(0);
           }
  }

}

  1. [/code][code][quote][/quote]
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-04-23 14:41 |只看该作者

:oops: 多进程的信号处理遇到的问题,再现等待!!!!

你这个问题比较复杂的,我也不能确信,试着分析一下吧:
1、子进程未对SIGINT信号重新定义,所以继承父进程的行为,即按下中断键后父子进程都会收到SIGINT信号,但处理结果不同:父进程向子进程发送SIGUSR1信号,子进程(pid=0)向同组的所有进程发送SIGUSR1信号(包括父进程)
2、由于sigfillset(&(pact.sa_mask)); 所以在SIGINT的信号处理函数中屏敝了所有的信号,包括SIGUSR1。所以在信号处理过程中,父进程不会结束。处理完后,会有两种情况:1、按了不止一个中断键,这时有两个未决信号:SIGINT和SIGUSR1需要处理,处理的顺序是不确定的,这将使程序表现为中止(先处理SIGUSR1)或再次执行p_action。2、只按了一个中断键,只有一个信号需要处理:SIGUSR1,程序中止。
对以上两处的修改都会使程序表现出不一样的执行结果

论坛徽章:
0
3 [报告]
发表于 2005-04-23 15:26 |只看该作者

:oops: 多进程的信号处理遇到的问题,再现等待!!!!

哈哈,果然是这个问题。在子进程中屏蔽一下对中断信号的相应。结果可以了。多谢楼上!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP