什么是signal(SIGCHLD, SIG_IGN)函數
在進行網絡編程時候遇到這個函數的使用,自己學習結果如下,有不對請幫忙指正:)
signal(SIGCHLD, SIG_IGN)
打開manpage康一康~
sighandler_t signal ( int signum, sighandler_t handler );
參數1 int signum: 就是信號的種類,這里是通過信號回收子進程的SIGCHLD. 子進程要終止了,發個SIGCHLD信號告訴父進程
參數2 sighandler_t handler: 這里選的是SIG_IGN, 忽視信號
這個函數總的意思就是: 我父進程不關心你子進程啥時候要退出,一會你退了以后內核把pcb那些該回收的那些回收了就行了(包括子進程號、運行時間信息,占用的內存,mask等等),別告訴我了嚎~
這是一個異步的子進程結束后的料理后事的語句。
為啥要特意寫這個函數交代子進程結束以后的“后事”呢?
一切都要從“僵尸進程”這個詞說起~
僵尸進程:
子進程已經結束了,不僅父進程沒有通過wait/waitpid函數回收,而且init也沒回收。這種情況下,這個子進程就變成了僵尸進程。
通俗來講,就是兒子嗝屁了,爸爸沒收視,孤兒院也沒收尸,這個兒子就成了個沒人管僵尸:(
這樣的壞處就是,這個僵尸子進程的一些東西(包括processID,運行時間,退出狀態,退出原因等),這些本來應該父進程來取時候釋放掉的東西無人問津了,會一直在占著內核,而且processID也一直被僵尸子進程占用著,這個ID號資源可是有限的啊,那要是僵尸多了,就沒有processID號分給新要產生的程序了。
所以為了避免一會產生僵尸兒子,父進程就說了,我很忙的哦,先干別的去了,一會子進程結束了以后,內核直接把殘余信息銷毀了就行了,別跟我說了哈~
當然,有的,父進程說我沒啥事情做,我來回收,可以采用阻塞(就是一直等著,直到子進程結束,然后回收掉)或者非阻塞方法回收,通過調用wait/waitpid函數,看看子進程結束了沒,結束了就趕緊回收掉,要是需要的話,也可以順便收集進程的結束原因等信息。
wait函數和waitpid區別:
waitpid可以根據pid指定回收哪個進程, wait是隨機回收一個子進程。