我有一些像这样的代码,我想了解fork是如何工作的,但我对declare(ticks = 1)感到困惑.
当我把它放在第一行时,在子进程完成后,将调用信号处理程序,这就是我想要的;但当我删除它时,永远不会调用信号处理程序!所以,我想知道滴答声如何影响信号处理.
当我把它放在第一行时,在子进程完成后,将调用信号处理程序,这就是我想要的;但当我删除它时,永远不会调用信号处理程序!所以,我想知道滴答声如何影响信号处理.
<?PHP declare(ticks=1); function sigHandler($signal) { echo "a child exited\n"; } pcntl_signal(SIGCHLD,sigHandler,false); echo "this is " . posix_getpid() . PHP_EOL; for($i=0; $i<3; $i++) { $pid = pcntl_fork(); if($pid == -1) { echo 'fork Failed ' . PHP_EOL; } else if($pid) { } else { $pid = posix_getpid(); echo 'child ' . $pid . ' ' . time() . PHP_EOL; sleep(rand(2,5)); echo 'child ' . $pid . ' done ' . time() . PHP_EOL; exit(0); } } do { $pid = pcntl_wait($status); echo 'child quit ' . $pid . PHP_EOL; }while($pid > 0); echo 'parent done' . PHP_EOL; ?>
次要观察(引用函数名称pls.):
原文链接:https://www.f2er.com/php/137644.htmlpcntl_signal(SIGCHLD,'sigHandler',false);
涉及两种不同的API.
> pcntl_wait()调用阻塞,直到它从内核收到通知.
>中断处理是PHP解释器内部的事件循环.这是一个hack功能,从PHP5.3开始,有一种更好的方法可以做到这一点~pcntl_signal_dispatch().
>要回答问题,声明滴答声就像打开手机铃声一样,否则你永远不会注意来电.> PHP5.3方法工程更好,而且更可控.>大多数信号的默认信号处理程序是sigignore,它接收中断并且什么也不做.正如您已注册用户处理程序,我怀疑这是否正在使用.>我没有能够直接找到刻度线的默认值.>将ticks设置为较小的值会使脚本abit运行得更慢,但是你需要进行繁重的处理和监视才能注意到这一点.它会降低可预测的执行成本,我想是因为在堆栈中复制了一些东西.>如果没有声明滴答声或pcntl_signal_dispatch(),则不会拾取信号.如果您正在编写简单的网页,它会很快终止;这可能是最明智的政策.>声明刻度需要仔细测试,因为它具有令人困惑的范围规则.将它放在第一个脚本的最安全的方法,比如在Perl中使用strict.