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

請教下pcntl 系列函數(shù)中信號(hào)機(jī)制的問題

phpcreeper

假如是這樣一種場景: 為了驗(yàn)證我的一些猜想,在PHP腳本內(nèi)部, 我在父進(jìn)程發(fā)送SIGTERM信號(hào)給其派生的所有子進(jìn)程(也就是使用posix_kill函數(shù)發(fā)送SIGTERM信號(hào)), 期間使用了pcntl_signal注冊信號(hào),并設(shè)定了父進(jìn)程的信號(hào)處理函數(shù), 根據(jù)我理解的理論知識(shí),如果沒有設(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)過試驗(yàn),我發(fā)現(xiàn)所有的子進(jìn)程還是被終止退出了....., 請問老大是我理解的信號(hào)機(jī)制有問題呢還是代碼編寫有問題?

另外我已經(jīng)模擬編寫了一個(gè)多進(jìn)程PHP腳本,你看是否能幫看下這個(gè)腳本,謝謝?~~

3639 12 0
12個(gè)回答

walkor 打賞

要給子進(jìn)程設(shè)置 SIGTERM信號(hào)處理函數(shù),而不是父進(jìn)程

  • 暫無評(píng)論
phpcreeper

老大, 不好意思,是我表述不準(zhǔn)確, 我是給子進(jìn)程設(shè)置 SIGTERM信號(hào)處理函數(shù)~~

  • 暫無評(píng)論
walkor 打賞

把代碼貼下吧

  • 暫無評(píng)論
phpcreeper

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

  • 暫無評(píng)論
phpcreeper

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

  • 暫無評(píng)論
walkor 打賞

你的子進(jìn)程終止是因?yàn)檫\(yùn)行到了exit
https://github.com/blogdaren/debug/blob/master/fork.php#L303

  • 暫無評(píng)論
phpcreeper

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

  • 暫無評(píng)論
walkor 打賞

額,自己理下吧

  • 暫無評(píng)論
phpcreeper

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

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

  • 暫無評(píng)論
walkor 打賞

現(xiàn)在代碼沒問題,
之前之所以退出是因?yàn)樽舆M(jìn)程運(yùn)行到了exit。和信號(hào)沒直接關(guān)系

  • 暫無評(píng)論
phpcreeper

謝謝, 我找到問題的根本了, 經(jīng)過大量的實(shí)踐論證不是exit 的原因, 是348行處子進(jìn)程信號(hào)相關(guān)代碼有問題(pcntl_signal(SIGTERM, SIG_DFL) 是個(gè)關(guān)鍵), 非常感謝耐心的解答~~

  • 暫無評(píng)論
walkor 打賞

。。。
你沒有找到問題的關(guān)鍵,之前子進(jìn)程退出是因?yàn)樽舆M(jìn)程阻塞在sleep()系統(tǒng)調(diào)用,當(dāng)收到信號(hào)后,sleep系統(tǒng)會(huì)立刻返回,導(dǎo)致start_business_worker函數(shù)就此執(zhí)行完畢,直接運(yùn)行到exit,子進(jìn)程退出。

修改后的版本因?yàn)樵谧舆M(jìn)程加了while{sleep},即使sleep遇到信號(hào)返回,但是因?yàn)檫€在while循環(huán)中,所以一直在start_business_worker,不會(huì)返回,所以沒有問題。

  • 暫無評(píng)論
年代過于久遠(yuǎn),無法發(fā)表回答
??