首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SIGCHLD处理程序重新安装

SIGCHLD处理程序重新安装
EN

Stack Overflow用户
提问于 2011-12-07 23:57:28
回答 2查看 1.1K关注 0票数 1

我看到了一些SIGCHLD处理程序的示例,如:

代码语言:javascript
复制
void child()                                                                                                                  
{                                                                                                                    
    wait(0);                                                                                                          
    signal(SIGCHLD, child);      
}  
void server_main()
{
    ...
    signal(SIGCHLD, child);
    ...
    for(;;;) {
        ...
        switch(fork()) {
        ...
        }
    }

处理程序中有两部分使我感到困惑: 1)。当子节点终止或停止时,会捕获SIGCHLD。那么为什么需要在处理程序中调用等待呢?信号已经到了。2)。为什么需要重新安装SIGCHLD处理程序。信号调用不是会一劳永逸地安装处理程序吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2011-12-08 00:00:47

子进程完成执行时将触发

  1. SIGCHLD。但是,它仍将在进程表中(作为一个所谓的僵尸进程),以便让父进程获取子进程的退出值。调用wait()将清除子进程中的处理表。
  2. --如果您只创建n子进程,那么当所有n子进程死亡时,信号处理程序就不再存在。

我建议您看一看sigaction,因为signal的行为因单变量而异。

票数 2
EN

Stack Overflow用户

发布于 2011-12-08 00:07:57

不是信号调用会一劳永逸地安装处理程序吗?

您不能依赖这种行为;也许信号处理程序将被清除,也许它将持续存在。这是历史信号处理问题的一部分。我的系统上的signal(3)手册报告:

代码语言:javascript
复制
   When a signal occurs, and func points to a function, it is
   implementation-defined whether the equivalent of a:


          signal(sig, SIG_DFL);

   is executed or the implementation prevents some
   implementation-defined set of signals (at least including
   sig) from occurring until the current signal handling has
   completed.

不可靠的信号几乎被sigaction(2)-based信号所取代,这些信号是在SysVr4中引入的,在POSIX.1-2001中标准化的:

代码语言:javascript
复制
   struct sigaction {
      void     (*sa_handler)(int);
      void     (*sa_sigaction)(int, siginfo_t *, void *);
      sigset_t   sa_mask;
      int        sa_flags;
      void     (*sa_restorer)(void);
   };

   int sigaction(int signum, const struct sigaction *act,
                 struct sigaction *oldact);

可悲的是,编写这些程序更加复杂,但是一旦编写了代码,您就不必怀疑是否需要重新安装处理程序--您也不必担心信号在处理信号时会第二次到达。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8424420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档