array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'zh', ), 'this' => array ( 0 => 'function.pcntl-signal.php', 1 => 'pcntl_signal', ), 'up' => array ( 0 => 'ref.pcntl.php', 1 => 'PCNTL 函数', ), 'prev' => array ( 0 => 'function.pcntl-signal-get-handler.php', 1 => 'pcntl_signal_get_handler', ), 'next' => array ( 0 => 'function.pcntl-sigprocmask.php', 1 => 'pcntl_sigprocmask', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'zh', 'path' => 'reference/pcntl/functions/pcntl-signal.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
pcntl_signal — 安装信号处理程序
pcntl_signal() 函数为 signal
指定的信号安装新的信号处理程序或替换当前信号处理程序。
signal
信号编号。
handler
信号处理程序。要么是 callable,将调用它来处理信号,要么是全局常量 SIG_IGN
或
SIG_DFL
,将分别用于忽略信号或恢复默认信号处理程序。
如果指定为 callable,必须实现以下签名:
signal
siginfo
注意:
请注意,当处理程序设置为对象方法时,该对象的引用计数会增加,这会使其持续存在,直到将处理程序更改为其他内容或脚本结束为止。
restart_syscalls
指定当信号到达时系统调用重启是否可用。(译注:经查资料,此参数意为系统调用被信号打断时,系统调用是否从 开始处重新开始,但根据 http://bugs.php.net/bug.php?id=52121,此参数存在bug无效。)
版本 | 说明 |
---|---|
7.1.0 | 从 PHP 7.1.0 开始,处理程序 callback 指定为第二个参数,其中包含特定信号的 siginfo。仅当操作系统具有 siginfo_t 结构体时才提供此数据。如果操作系统未实现 siginfo_t,则提供 NULL。 |
示例 #1 pcntl_signal() 示例
<?php
// 需要使用 ticks
declare(ticks = 1);
// 信号处理函数
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// 处理终止任务
exit;
break;
case SIGHUP:
// 处理重启任务
break;
case SIGUSR1:
echo "Caught SIGUSR1...\n";
break;
default:
// 处理所有其它信号
}
}
echo "Installing signal handler...\n";
// 安装信号处理程序
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// 或使用对象
// pcntl_signal(SIGUSR1, array($obj, "do_something");
echo "Generating signal SIGUSR1 to self...\n";
// 向当前进程 ID 发送 SIGUSR1 信号
// posix_* 函数需要 posix 扩展
posix_kill(posix_getpid(), SIGUSR1);
echo "Done\n";
?>
pcntl_signal() 不堆叠信号处理程序,而是替换。