php – pcntl_sigwaitinfo和信号处理程序
我正在写一个守护进程,它会在一段时间内完成一些工作,并在再次重复之前休息一段时间.但它必须在睡眠时对外部影响(即终止请求)作出反应.
我设法用ALRM信号实现睡眠超时,并用TERM信号终止(样本): // ... declare(ticks = 1); function do_work() { echo "Doing some work.n"; } $term = FALSE; $sighandler = function ($signal) use (&$term) { if ($signal === SIGTERM) { pcntl_alarm(0); $term = TRUE; echo "TERM HANDLERn"; } else { echo "ALRM HANDLERn"; } }; pcntl_signal(SIGALRM,$sighandler); pcntl_signal(SIGTERM,$sighandler); while (!$term) { do_work(); // Kick myself after 2 seconds pcntl_alarm(2); // Wait for alarm or termination $signal = pcntl_sigwaitinfo(array(SIGTERM,SIGALRM),$info); pcntl_signal_dispatch(); switch ($signal) { case SIGALRM: echo "ALRM SIGWIn"; break; case SIGTERM: echo "TERM SIGWIn"; $term = TRUE; break; } } // ... 但是为了上帝的缘故,我无法弄清楚为什么sighandler从未被召唤过.我得到以下输出: $php sigsample.php Doing some work. ALRM SIGWI Doing some work. ALRM SIGWI Doing some work. TERM SIGWI 同时,如果我没有设置此处理程序,脚本会因为信号不正确而死亡. 我错过了一些人吗?为什么我的信号处理函数从未调用过? pcntl_sigwaitinfo()会干扰吗? 是否还有其他方法可以同时实现超时和信号处理? 解决方法
这并非完全出乎意料.
您已经要求传递给信号处理程序(pcntl_signal(…)),但随后还要求接受该信号而不调用任何处理程序(pcntl_sigwaitinfo(…)).您的操作系统可以决定在这种情况下会发生什么,并且您的操作系统(如我的)选择让pcntl_sigwaitinfo()获胜. 背景 进程可以通过两种不同的方式接收(“遭受?”)信号: >异步传递 这两种方式,即交付和接受,均为different,并不意味着一起使用.例如,AIX只是禁止“[c]oncurrent use of sigaction and sigwait“. (与上述相关的是信号掩码的概念,它可以“阻止”信号,有效地强制它们保持待决状态直到被接受或直到“解除阻塞”并被传递.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |