信号是一种系统调用。通常我们用的kill命令就是发送某个信号给某个进程的。父进程向子进程发送sigint信号。子进程捕获信号,调用信号处理函数处理。
上代码
<?php
$ppid = posix_getpid();
echo "父进程的进程号:{$ppid}".PHP_EOL;
// 定义一个信号处理函数
function sighandler($signo) {
$pid = posix_getpid();
echo "{$pid} 进程退出".PHP_EOL;
exit(1);
}
$pid = pcntl_fork();
if ( $pid == -1) {
// 创建失败
exit("子进程创建失败".PHP_EOL);
} else if ($pid == 0) {
// 子进程执行程序
declare(ticks=10);
// 注册信号处理函数
pcntl_signal(SIGINT, "sighandler");
$pid = posix_getpid();
while(true){
echo "{$pid} 子进程正在运行,等待任务!".PHP_EOL;
sleep(1);
}
exit("({$pid})子进程退出!").PHP_EOL;
}else{
// 父进程执行程序
$childList[$pid] = 1;
// 5秒后,父进程向子进程发送sigint信号.
sleep(3);
posix_kill($pid,SIGINT);
sleep(5);
}
echo "({$ppid})主进程执行完毕".PHP_EOL;
//执行结果
image.png
整个通讯思路是
- 先定义好信号函数
- 子进程将指定信号与函数进行绑定
- 子进程正常工作,当接收到信号的时候,执行相对应的函数,这样子就可以实现父->子进程之间的通讯了






网友评论