2013-02-13 66 views
8

信號處理程序已註冊爲[SIGINT]後,進程具有'fork'調用。通過命令行發送SIGINT時會發生什麼?是否父母退出或孩子或兩者兼而有之?父母和孩子都在循環中運行無限。信號處理程序的父級和子級的行爲

回答

12

如果你在做了fork(沒有進一步的exec*)之後註冊了一個信號處理程序,那麼在父進程和子進程中將使用相同的信號處理程序。也就是說,如果您在SIGINT處理程序中執行exit以外的任何操作,那麼父母和子都不會退出(發送SIGINT的方式與此無關)。

如果意味着SIGINT終端(由vintr字符通常是Ctrl+C)發送的:它會通過使用終端作爲控制終端的過程來接收。也就是說,除非您將孩子或父母從控制終端上分離出來,否則通過致電SIGINT處理程序將對Ctrl+C做出反應。

+0

但是信號處理程序在fork()之前註冊,所以孩子不應該有副本。在fork()之後,子應該執行fork()之後的語句。信號處理程序註冊將只在父級。 – Puneet 2013-02-13 11:57:31

+4

@Puneet無論你怎麼看待它,它都會被孩子繼承。見'man sigaction'。有什麼奇怪的呢? 'fork'之前打開的文件描述符也被繼承。信號的唯一特別之處在於,非默認的非忽略*處理程序在'execve'和好友處重置(因爲處理程序的地址在新的可執行文件中沒有意義),但是在fork上沒有發生這種情況。 – 2013-02-13 12:12:14

+0

謝謝你,先生...懷疑清除... – Puneet 2013-02-13 12:19:29