信号是中断机制的基础。信号对于进程而言是随机出现的。对于信号的处理有三个动作:忽略此信号;捕捉信号(执行特定的函数);执行系统的默认动作。在此说明的是,不能捕捉或者忽略SIGKILL和SIGSTOP信号。
常用的信号说明
SIGCHLD 在一个进程终止或停止时,将SIGCHLD信号发送给其父进程。按系统默认会忽略此信号。如果父进程希望被告知其子进程的这种状态改变,则应捕捉此信号。信号捕捉函数中通常调用一种wait函数取得子进程ID和终止状态
SIGHUP 如果终端接口检查到一个连接断开,则将此信号发送给该终端相关的控制进程。远程的终端断开,进程接受此信号,默认终止。
SIGINT 当用户按中断键(一般是Ctrl+C)时,终端驱动程序产生此信号并送至前台进程组中的每一个进程。
SIGQUIT 当用户在终端上按退出键(关闭终端),产生此信号,并送至前台进程组中的所有进程。
SIGTERM 由kill命令发送的系统默认终止信号。 (kill 进程ID)
下面来举例说明。
1 2 3 4 5 6 7 8 |
<?php declare(ticks = 1); pcntl_signal(SIGTERM, SIG_IGN); pcntl_signal(SIGINT, SIG_IGN); pcntl_signal(SIGHUP, SIG_IGN); pcntl_signal(SIGQUIT, SIG_IGN); for(;;) {} |
SIG_IGN 是忽略信号的标志。上面的程序在运行时,关闭,中断,或者终止,设置默认的kill命令都不会关闭此进程。已经把终止信号忽略掉了。除非用kill -9 命令强制关闭。此命令产生的是SIGKILL信号。
在运行脚本的时候,我们经常会用nohup来保持当终端关闭时,进程继续运行。通过上面忽略信号的做法也可以做到。