假如是這樣一種場景: 為了驗證我的一些猜想,在PHP腳本內部, 我在父進程發(fā)送SIGTERM信號給其派生的所有子進程(也就是使用posix_kill函數發(fā)送SIGTERM信號), 期間使用了pcntl_signal注冊信號,并設定了父進程的信號處理函數, 根據我理解的理論知識,如果沒有設定SIGTERM信號處理函數,默認情況下posix_kill會執(zhí)行SIGTERM信號的原始行為即終止子進程, 但是如果設定了SIGTERM信號處理函數(函數只是做了個echo而已), posix_kill的SIGTERM信號的原始行為就會被改變,但是經過試驗,我發(fā)現所有的子進程還是被終止退出了....., 請問老大是我理解的信號機制有問題呢還是代碼編寫有問題?
另外我已經模擬編寫了一個多進程PHP腳本,你看是否能幫看下這個腳本,謝謝?~~
老大, 我所在的群組無法發(fā)外部鏈接,代碼比較多, 所以放在github上了, 上面貼的地址是json化的, 你json解碼下地址然后訪問看看~
你的子進程終止是因為運行到了exit
https://github.com/blogdaren/debug/blob/master/fork.php#L303
這個exit 我注意到過, 如果不寫exit, 子進程就會繼續(xù)向下執(zhí)行腳本,也就是加上exit是防止其繼續(xù)向下執(zhí)行某些不應該執(zhí)行的代碼, 我試驗了下, 去掉exit語句后, (終端命令: kill -2 主進程ID) 又會派生3-4倍數量的子進程, 還是迷惑很~
老大, 我重新說下我的想法:
我貼的腳本只是個模擬腳本,實際絕對編程可能不這么用, 所以僅僅用于調試驗證我根據理論知識得出的某種猜測想法,因為我找不到足夠權威的資料來論證我的想法, 所以需要你幫我鑒定下腳本是否編寫有問題已經我的結論是否正確。
我得出的結論是: 腳本啟動后, 分別為父進程和子進程注冊信號,然后在父進程給子進程發(fā)送SIGTERM信號,如果子進程沒有設定信號捕捉函數,那么因SIGTERM進程就會被終止; 否則如果設定了信號處理函數, 并且這個函數只是簡單的輸出一句話完事兒,那么即便是捕捉到了SIGTERM信號,那么子進程也不應該退出(事實運行的結果是子進程赤裸裸的退出去了)
另外我發(fā)現我注釋了子進程的register_ticks信號的信號代碼, 居然子進程信號處理函數還能工作,無語
最后我修改了下模擬腳本,主要是模擬業(yè)務邏輯部分的代碼, 而且腳本末尾寫了大量的注釋, 煩請你幫再看下, 非常感謝, 腳本地址: https:\/\/github.com\/blogdaren\/debug\/blob\/master\/fork.php
謝謝, 我找到問題的根本了, 經過大量的實踐論證不是exit 的原因, 是348行處子進程信號相關代碼有問題(pcntl_signal(SIGTERM, SIG_DFL) 是個關鍵), 非常感謝耐心的解答~~