我看了你之前回到的代碼,有個地方我感覺有點疑問。
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ā)
你好,你的父進程執(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);
這幾天又再學(xué)習了下,按你原來的代碼,給pcntl_signal加個參數(shù)就行:
pcntl_signal(SIGINT, 'stopAll', false);
個人理解:在有信號來時,pcntl_wait會中斷一下再恢復(fù)。上面第三個參數(shù)默認是true,恢復(fù)的點是在wait之前,所以恢復(fù)后繼續(xù)wait阻塞;設(shè)置成false時,恢復(fù)會在wait之后,執(zhí)行后面的代碼。