假如是這樣一種場(chǎng)景: 為了驗(yàn)證我的一些猜想,在PHP腳本內(nèi)部, 我在父進(jìn)程發(fā)送SIGTERM信號(hào)給其派生的所有子進(jìn)程(也就是使用posix_kill函數(shù)發(fā)送SIGTERM信號(hào)), 期間使用了pcntl_signal注冊(cè)信號(hào),并設(shè)定了父進(jìn)程的信號(hào)處理函數(shù), 根據(jù)我理解的理論知識(shí),如果沒(méi)有設(shè)定SIGTERM信號(hào)處理函數(shù),默認(rèn)情況下posix_kill會(huì)執(zhí)行SIGTERM信號(hào)的原始行為即終止子進(jìn)程, 但是如果設(shè)定了SIGTERM信號(hào)處理函數(shù)(函數(shù)只是做了個(gè)echo而已), posix_kill的SIGTERM信號(hào)的原始行為就會(huì)被改變,但是經(jīng)過(guò)試驗(yàn),我發(fā)現(xiàn)所有的子進(jìn)程還是被終止退出了....., 請(qǐng)問(wèn)老大是我理解的信號(hào)機(jī)制有問(wèn)題呢還是代碼編寫有問(wèn)題?
另外我已經(jīng)模擬編寫了一個(gè)多進(jìn)程PHP腳本,你看是否能幫看下這個(gè)腳本,謝謝?~~
老大, 不好意思,是我表述不準(zhǔn)確, 我是給子進(jìn)程設(shè)置 SIGTERM信號(hào)處理函數(shù)~~
詳見(jiàn): https:\/\/github.com\/blogdaren\/debug\/blob\/master\/fork.php
老大, 我所在的群組無(wú)法發(fā)外部鏈接,代碼比較多, 所以放在github上了, 上面貼的地址是json化的, 你json解碼下地址然后訪問(wèn)看看~
你的子進(jìn)程終止是因?yàn)檫\(yùn)行到了exit
https://github.com/blogdaren/debug/blob/master/fork.php#L303
這個(gè)exit 我注意到過(guò), 如果不寫exit, 子進(jìn)程就會(huì)繼續(xù)向下執(zhí)行腳本,也就是加上exit是防止其繼續(xù)向下執(zhí)行某些不應(yīng)該執(zhí)行的代碼, 我試驗(yàn)了下, 去掉exit語(yǔ)句后, (終端命令: kill -2 主進(jìn)程ID) 又會(huì)派生3-4倍數(shù)量的子進(jìn)程, 還是迷惑很~