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

關于信號中斷 wait 系統(tǒng)調用的問題

phpcreeper

問題重現:
原帖子:http://wenda.workerman.net/?/question/883
walkor大大在回復中有這么一段話:
【pcntl_wait其實就是wait系統(tǒng)調用,是可以被信號打斷的,當信號到來后pcntl_wait會立刻返回。
同理sleep也是系統(tǒng)調用,也可以被信號打斷停止睡眠立刻返回。所以在pcntl_wait或者sleep下的pcntl_signal_dispatch函數在收到信號后會立刻被執(zhí)行】

問題調試:
詳見附件兩副截圖

[attach]1217[/attach]

[attach]1218[/attach]

測試結果:
信號確實會中斷 sleep 系統(tǒng)調用,但是并未中斷 wait 系統(tǒng)調用。

期望結果:
期望結果如walkor大大所言那樣。

5194 6 0
6個回答

walkor 打賞

一次信號只中斷一個系統(tǒng)調用,并且只中斷正在阻塞的系統(tǒng)調用,其它還沒執(zhí)行到的不會影響

  • 暫無評論
phpcreeper

凹, 事實上我單獨做過針對沒有 sleep 系統(tǒng)調用的調試【即注釋圖中13-14行代碼】, 也就是說只測試信號對單獨 pcntl_wait 調用的影響,運行以后也無法中斷wait調用呢。

  • 暫無評論
walkor 打賞
<?php
    pcntl_signal(SIGINT, function(){echo "get signal\n";});
    $pid = pcntl_fork();

    if ($pid) {
        pcntl_wait($status, WUNTRACED);
        echo "pcntl_wait return\n";
    } else {
        sleep(1000);
    }

我這測試是正常的

  • 暫無評論
phpcreeper

嗯,把你的代碼和我的代碼都調試了一遍, 似乎發(fā)現問題的癥結了:

測試時一直是終端直接發(fā)送 kill -2 pid 信號指令 --> 發(fā)現無法中斷系統(tǒng)調用
剛我順手用了 CTRL + C 指令 --> 發(fā)現能夠正常中斷系統(tǒng)調用
CTRL + C 和 kill -2 pid 按理說一樣的啊,這是為什么呢?

  • 暫無評論
phpcreeper

@walkor 感謝,經調試,已經達到如你所說的預期效果,strace跟蹤了下,發(fā)現我提供的DEMO代碼存在問題,即:
pcntl_signal ( int signo, callback handle ) 最后一個參數忘記需要設置為false

  • 暫無評論
walkor 打賞

好的

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