终端输入man 7 signal查看手册
第一列(Signal)为信号名称
第二列(Value)为信号对应的值(实际上就是个宏定义),有多个值是因为该信号量在不同平台下的值不同(如ARM/x86),其中第二个值对应x86平台。
第三列(Action)为进程接收到信号后的默认行为,其中:
Term = Terminate,进程终结
Core = Core dump,进程终结并保存进程退出信息以供调试
Ign = Ignore,忽略信号
Stop,进程挂起/暂停
Cont = Continue,激活挂起的进程
SIGHUP
Signal Hung Up
当一个会话(Session)终止时(通常是关闭一个终端),该会话中所有进程将收到SIGHUP信号。
如果进程中对SIGHUP进行处理,即使关闭终端也不会终止进程。
SIGINT
Signal Interrupt
当我们在终端中输入Ctrl+C时,前台进程便会收到此信号
SIGQUIT
Signal Quit
比起SIGINT多了一个核心转储,在终端以Ctrl+\输入
SIGILL
Signal illegal
执行了非法指令。通常是因为可执行文件本身出现段错误,堆栈溢出。
SIGABRT
Signal Abort
执行abort()函数时发出的信号
SIGKILL
Signal Kill
立即终止指定进程,该信号无法被捕获或忽略
SIGPIPE
Signal Pipe
向无读者的管道写入数据时触发的信号,在网络编程中需注意处理
SIGTERM
Signal Terminate
程序结束信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。
SIGCHLD
Signal Child
子进程退出时父进程收到的信号,若父进程不用wait()对子进程退出信息进行处理,子进程将成为僵死进程占用进程表。
SIGSTOP
Signal Stop
停止(stopped)进程的执行。注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行。不能被阻塞或忽略。
SIGTSTP
停止进程的运行, 但该信号可以被捕获和忽略。 在终端输入Ctrl+Z时发出这个信号。
SIGCONT
Signal Continue
让一个停止(stopped)的进程继续执行。不可被捕获或忽略。
信号的捕获与处理
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int sig,void(*func)(int));
sig为想要处理的信号。
void(*func)(int)为处理该信号的函数。系统提供两个处理函数的宏:SIG_DFL(恢复信号默认处理方式)SIG_IGN(忽略该信号),当然用户也可以自定义处理函数。
返回值sighandler_t将返回该信号的上一个处理函数,如出错则返回SIG_ERR,错误信息保存在errno
实例
#include <iostream>
#include <unistd.h>
#include <signal.h>
void sighandle(int sig)
{
std::cout << std::endl
<< "signal received :"
<< sig
<< std::endl;
}
int main(int argc,char **argv)
{
signal(SIGHUP, SIG_IGN);//忽略SIGHUP
signal(SIGINT, sighandle);//收到SIGINT时跳转到处理函数sighandle
pause();
return 0;
}
运行程序后输入Ctrl+C,成功捕获SIGINT信号
将终端关闭后开启新的终端,查询发现程序依然在后台运行,忽略了终端关闭时发送的SIGHUP信号