system函数和signal(SIGCHLD, SIG_DFL)的“固定搭配”

背景知识:

子进程先于父进程结束时,会给父进程发送SIGCHLD信号

如果
                                                                    1、父进程没有忽略SGICHLD信号;
                                                                     或者
                                                                     2、父进程没有调用wait或waitpid函数。
                                                          那么子进程将僵死。

                                                         

                                                      (

                                                                在2.6内核只要父进程显式忽略了SIGCHLD信号,

                                                                那么子进程将不会僵死,那么system将得不到子进程的退出状态。

                                                                 也就是说system函数的返回值并不是子进程退出时的状态。

 

                                                                 而2.4内核,只要父进程没有调用wait系列函数,子进程就将僵死。
                                                                                     不论是否忽略了SIGCHLD信号

                                                          )

如果,我们在我们的server中需要调用system来调用外部脚本程序来执行某写工作。

 

        int   ret   =    system(command);    

        if( ret == 0)

        {

                              //成功

        }  

        else

         {

                             //失败

         }

 

其中ret用来接收子进程退出是的返回值。即exit的返回值。

        但是由于在deamon中忽略了SIGCHLD信号,所以主进程将不再接收子进程的返回值。所以,ret的值不能正确反映子进程的退出状态

 

        正确的做法是::

                sighandler_t old_handler;

                old_handler = signal(SIGCHLD,SIG_DFL);                //为了准确地获取 system 函数的返回值,不能显式(SIG_IGN)地忽略 SIGCHLD 信号

                system(command);            //system 函数:1.fork一个进程;2.在子进程中调用 exec() 去执行新程序;3.在父进程中调用 waitpid 去等待子进程结束

                signal(SIGCHLD,old_handler);        //old_handler 记录了之前对于 SIGCHLD 信号的处理方式,现在还原回去

 

2、system相关问题::

         system函数其实是调用fork,exec,waitpid来实现的。

              1、fork一个进程;

              2、在子进程中调用exec去执行新程序。

              3、在父进程中调用waitpid去等待子进程结束。

       如果在父进程已经signal(SIGCHLD,SIG_IGN);那么子进程结束时,子进程的返回值不能被waitpid接收。

       这个是必须关注的问题。

原文地址:http://www.360doc.com/content/14/0305/09/13084517_357841525.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值