免费注册 查看新帖 |

Chinaunix

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

请高手帮忙呀!!!!!!!!!!!!!!!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-27 20:42 |只看该作者 |倒序浏览


在看APUE10.18这节看调用system函数的程序时,有个问题向大家讨教。以下时程序的简单描述:

sig_int(int),sig_chld(int);
main()
{
signal(SIGINT,sig_int);
signal(SIGCHLD,sig_CHLD);
system("/bin/ed");
}


书上给的system函数代码:


int system(const char *cmdstring)
{
    pid_t             pid;
    int               status;
    struct sigaction  ignore, saveintr, savequit;
    sigset_t          chldmask, savemask;

    if (cmdstring == NULL)
       return (1);  //always a command processor with unix

      
    ignore.sa_handler = SIG_IGN; //ignore SIGINT and SIGQUIT
    sigempty(&ignore.sa_mask);
    ignore.sa_flags = 0;

    if (sigaction(SIGINT, &ignore, &saveintr) < 0)
       return (-1);

    if (sigaction(SIGQUIT,&ignore, &savequit) < 0)
       return (-1);

    sigemptyset(&chldmask);        //now block SIGCHLD
    sigaddset(&chldmask, SIGCHLD);
    if (sigprocmask(SIG_BLOCK, &chldmask, &savemask) < 0)
       return (-1);

    if ( (pid = fork()) < 0)
    {
         status = -1; //probably out of  processes
    }
    else if (pid == 0)
    {
         //restore previous signal actions & reset signal mask
         sigaction(SIGINT, &saveintr, NULL);
         sigaction(SIGQUIT, &savequit, NULL);
         sigprocmask(SIG_SETMASK, &savemask, NULL);

         execl("/bin/sh", "sh", "-c", cmdstring, (char*)0);
         _exit(127);      //exec error
    }
    else
    {
        while (waitpid(pid, &status, 0) < 0)
              if (errno != EINTR)
              {
                 status = -1; //error other than EINTR form waitpid()
                 break;
              }
    }

   
    if (sigaction(SIGINT, &saveintr, NULL) < 0)
       return (-1);
    if (sigaction(SIGQUIT, &savequit, NULL) < 0)
       return (-1);

    if (sigprocmask(SIG_SETMASK, &savemask, NULL) < 0)
       return (-1);
   
    return (status);
   
}

书上说这个主程序的过程是:a.out(父进程)fork出一个shell处理命令,然后在shell上fork一个进程那就是ed。

在解释这个程序是有这么一段话:“当编辑程序终止时,对父进程(a.out进程)产生SIGCHLD信号。父进程捕捉它,执行其处理程序 sig_chld,然后从其返回。但是若父进程正捕捉SIGCHLD信号,那么在system函数执行时,父进程中该信号的递送应当阻塞。实际上,这就是 POSIX所说明的。否则,当system创建的子进程结束时system的调用者可能错误地认为,它自己的一个子进程结束了。”


我的疑问是:1 父进程正捕捉SIGCHLD信号是什么意思????
system创建的子进程结束时system的调用者可能错误地认为,它自己的一个子进程结束了,这又是什么意思???
但是若父进程正捕捉SIGCHLD信号,那么在system函数执行时,父进程中该信号的递送应当阻塞,这又是为什么呢???

请高手帮忙呀!!!!!!!!!!!!!!!!!!

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP