国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

請教下pcntl 系列函數中信號機制的問題

phpcreeper

假如是這樣一種場景: 為了驗證我的一些猜想,在PHP腳本內部, 我在父進程發(fā)送SIGTERM信號給其派生的所有子進程(也就是使用posix_kill函數發(fā)送SIGTERM信號), 期間使用了pcntl_signal注冊信號,并設定了父進程的信號處理函數, 根據我理解的理論知識,如果沒有設定SIGTERM信號處理函數,默認情況下posix_kill會執(zhí)行SIGTERM信號的原始行為即終止子進程, 但是如果設定了SIGTERM信號處理函數(函數只是做了個echo而已), posix_kill的SIGTERM信號的原始行為就會被改變,但是經過試驗,我發(fā)現所有的子進程還是被終止退出了....., 請問老大是我理解的信號機制有問題呢還是代碼編寫有問題?

另外我已經模擬編寫了一個多進程PHP腳本,你看是否能幫看下這個腳本,謝謝?~~

3535 12 0
12個回答

walkor 打賞

要給子進程設置 SIGTERM信號處理函數,而不是父進程

  • 暫無評論
phpcreeper

老大, 不好意思,是我表述不準確, 我是給子進程設置 SIGTERM信號處理函數~~

  • 暫無評論
walkor 打賞

把代碼貼下吧

  • 暫無評論
phpcreeper

詳見: https:\/\/github.com\/blogdaren\/debug\/blob\/master\/fork.php

  • 暫無評論
phpcreeper

老大, 我所在的群組無法發(fā)外部鏈接,代碼比較多, 所以放在github上了, 上面貼的地址是json化的, 你json解碼下地址然后訪問看看~

  • 暫無評論
walkor 打賞

你的子進程終止是因為運行到了exit
https://github.com/blogdaren/debug/blob/master/fork.php#L303

  • 暫無評論
phpcreeper

這個exit 我注意到過, 如果不寫exit, 子進程就會繼續(xù)向下執(zhí)行腳本,也就是加上exit是防止其繼續(xù)向下執(zhí)行某些不應該執(zhí)行的代碼, 我試驗了下, 去掉exit語句后, (終端命令: kill -2 主進程ID) 又會派生3-4倍數量的子進程, 還是迷惑很~

  • 暫無評論
walkor 打賞

額,自己理下吧

  • 暫無評論
phpcreeper

老大, 我重新說下我的想法:

我貼的腳本只是個模擬腳本,實際絕對編程可能不這么用, 所以僅僅用于調試驗證我根據理論知識得出的某種猜測想法,因為我找不到足夠權威的資料來論證我的想法, 所以需要你幫我鑒定下腳本是否編寫有問題已經我的結論是否正確。
我得出的結論是: 腳本啟動后, 分別為父進程和子進程注冊信號,然后在父進程給子進程發(fā)送SIGTERM信號,如果子進程沒有設定信號捕捉函數,那么因SIGTERM進程就會被終止; 否則如果設定了信號處理函數, 并且這個函數只是簡單的輸出一句話完事兒,那么即便是捕捉到了SIGTERM信號,那么子進程也不應該退出(事實運行的結果是子進程赤裸裸的退出去了)
另外我發(fā)現我注釋了子進程的register_ticks信號的信號代碼, 居然子進程信號處理函數還能工作,無語
最后我修改了下模擬腳本,主要是模擬業(yè)務邏輯部分的代碼, 而且腳本末尾寫了大量的注釋, 煩請你幫再看下, 非常感謝, 腳本地址: https:\/\/github.com\/blogdaren\/debug\/blob\/master\/fork.php

  • 暫無評論
walkor 打賞

現在代碼沒問題,
之前之所以退出是因為子進程運行到了exit。和信號沒直接關系

  • 暫無評論
phpcreeper

謝謝, 我找到問題的根本了, 經過大量的實踐論證不是exit 的原因, 是348行處子進程信號相關代碼有問題(pcntl_signal(SIGTERM, SIG_DFL) 是個關鍵), 非常感謝耐心的解答~~

  • 暫無評論
walkor 打賞

。。。
你沒有找到問題的關鍵,之前子進程退出是因為子進程阻塞在sleep()系統(tǒng)調用,當收到信號后,sleep系統(tǒng)會立刻返回,導致start_business_worker函數就此執(zhí)行完畢,直接運行到exit,子進程退出。

修改后的版本因為在子進程加了while{sleep},即使sleep遇到信號返回,但是因為還在while循環(huán)中,所以一直在start_business_worker,不會返回,所以沒有問題。

  • 暫無評論
年代過于久遠,無法發(fā)表回答
??