2010-07-12 29 views
4

叉中的信号行为是什么。 所有的信号都应该在fork中继承如果不是那么哪一个,为什么?叉中的信号

回答

13

至少在Linux下,信号处理程序本身是继承的,但不是挂起的信号。

引述了Linux fork(2)man page

叉()创建一个子进程从父进程只有在其PID和PPID不同,在资源利用率设置为0文件锁定的事实并且待处理的信号不被继承。

这很有意义,因为信号属于(父母)过程。新创建的进程(大部分)是当前进程的副本,因此可以保留信号处理程序。

虽然没有直接的关系,在exec()型呼叫往往遵循fork()销毁所有的信号处理程序,因为一个全新的可执行文件被加载到进程(目前覆盖服务信号的功能)。

+0

虽然'exec()'类型的调用不会重置任何设置为'SIG_IGN'的东西。至少在Linux上,这些设置会逐渐向下排列。这可能会导致一些讨厌的东西:将'SIGCHLD'设置为'SIG_IGN',然后产生一个shell :-) 我看到你也回答了* [这里](http://stackoverflow.com/questions/32708086/忽略信号在父母进程),所以不要介意;-) – Steven 2017-02-06 12:49:32

0

但要确保您的代码在所有平台上的可移植性和一致性,最好检查可能影响程序执行的信号行为。尽管Linux保证如此,但实现可以自由选择他们想要的方式执行。 sigaction可以派上用场。

0

我将与paxdiablo答案一样,尽管信号处理程序被复制,但挂起信号被重新初始化。 这里是从do_fork中的内核源代码中剪切出来的,它实际上代表进程分叉。

/*do_fork(...)*/ 
spin_lock_init(&p->alloc_lock); 

init_sigpending(&p->pending);// reinitializing the pending signals