我看到了一些SIGCHLD处理程序的示例,如:
void child()
{
wait(0);
signal(SIGCHLD, child);
}
void server_main()
{
...
signal(SIGCHLD, child);
...
for(;;;) {
...
switch(fork()) {
...
}
}处理程序中有两部分使我感到困惑: 1)。当子节点终止或停止时,会捕获SIGCHLD。那么为什么需要在处理程序中调用等待呢?信号已经到了。2)。为什么需要重新安装SIGCHLD处理程序。信号调用不是会一劳永逸地安装处理程序吗?
谢谢!
发布于 2011-12-08 00:00:47
子进程完成执行时将触发
wait()将清除子进程中的处理表。n子进程,那么当所有n子进程死亡时,信号处理程序就不再存在。我建议您看一看sigaction,因为signal的行为因单变量而异。
发布于 2011-12-08 00:07:57
不是信号调用会一劳永逸地安装处理程序吗?
您不能依赖这种行为;也许信号处理程序将被清除,也许它将持续存在。这是历史信号处理问题的一部分。我的系统上的signal(3)手册报告:
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中标准化的:
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);可悲的是,编写这些程序更加复杂,但是一旦编写了代码,您就不必怀疑是否需要重新安装处理程序--您也不必担心信号在处理信号时会第二次到达。
https://stackoverflow.com/questions/8424420
复制相似问题