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

pcntl_wait 信號觸發(fā)問題

qpao123

我看了你之前回到的代碼,有個地方我感覺有點疑問。

function stopAll($sig){
    echo "master has a sig $sig\n" ;
}

$master_id = getmypid();

$pid = pcntl_fork();
if($pid > 0)
{
    pcntl_signal(SIGINT,'stopAll') ;
    $epid = pcntl_wait($status,WUNTRACED);
    pcntl_signal_dispatch();
    echo "parent process {$master_id}, child process {$pid}\n";
    if($epid){
        echo "child $epid exit \n" ;
    }
}
else
{
    $id = getmypid();
    echo "child process,pid {$id}\n";
    sleep(6);
    echo "send signal to master\n";
    posix_kill($master_id, SIGINT);
    while(true){
        sleep(3);
    }
}

這是你之前寫的代碼,我只是在else里面加了一個循環(huán),保證子進程不會中斷。這樣,就算之前發(fā)送了posix_kill($master_id, SIGINT)信號,信號回調(diào)函數(shù)還是不會觸發(fā)

4107 2 0
2個回答

t182848232

你好,你的父進程執(zhí)行到pcntl_wait就掛起了,一直在等待子進程結(jié)束,而子進程因為while循環(huán)一直沒有結(jié)束,所以父進程后面的代碼并不會執(zhí)行。
我想父進程里的代碼可以調(diào)整成這樣:

pcntl_signal(SIGINT, 'stopAll');
sleep(7);
// 因為子進程sleep了6秒才發(fā)信號過來,所以這里等待大于6秒的時間才把信號分發(fā)給回調(diào)函數(shù)
pcntl_signal_dispatch();
// 發(fā)送終止子進程的信號
posix_kill($pid, SIGTERM);
// pcntl_wait等到子進程終止后繼續(xù)執(zhí)行后續(xù)代碼
$epid = pcntl_wait($status);

  • 暫無評論
t182848232

這幾天又再學(xué)習了下,按你原來的代碼,給pcntl_signal加個參數(shù)就行:

pcntl_signal(SIGINT, 'stopAll', false);

個人理解:在有信號來時,pcntl_wait會中斷一下再恢復(fù)。上面第三個參數(shù)默認是true,恢復(fù)的點是在wait之前,所以恢復(fù)后繼續(xù)wait阻塞;設(shè)置成false時,恢復(fù)會在wait之后,執(zhí)行后面的代碼。

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