2010-07-12 83 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