信号是操做系统控制程序的方式,举个栗子,操做系统在看到用户输入了Ctrl+C时,就会向程序发送中断信号。 信号映射表git
信号 | 处理函数 |
---|---|
SIGURG | 不作事情 |
SIGINT | 调用exit() |
有时候你但愿别人打断你的程序时运行本身的代码。假设进程打开了一些文件或网络链接,你但愿在退出以前把它们关闭,而且作一些清理工做。在这里引入sigaction
结构。 sigaction是一个函数包装器 sigaction是一个结构体,它有一个函数指针,siagction告诉操做系统进程收到某个信号时该调用哪一个函数。github
struct sigaction action; action.sa_handler = handler; sigemptyset(&action.sa_mask); action.sa_flag = 0;
sigemptyset用于设置信号,在信号被使用前必须调用sigemptyset
或sigfillset
,sigemptyset
在man中的函数原型和解释是:网络
int sigemptyset(sigset_t *set);
The sigemptyset() function initializes a signal set to be empty.函数
将信号初始化设置为空。 处理器必须接收信号参数 信号是一个整型值,若是你建立了一个自定义处理函数,就须要接收一个整型参数:操作系统
void diediedie(int sig) { puts("Goodbye cruel world...\n"); exit(1); }
建立sigaction之后,须要用sigaction()函数注册,使操做系统知道它的存在。指针
int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);
sigaction()函数接收3个参数,信号,动做,旧动做(能够传NULL)。rest
int catch_signal(int sig, void (*handler)(int)) { struct sigaction action; action.sa_handler = handler; sigemptyset(&action.sa_mask); action.sa_flags = 0; return sigaction(sig, &action, NULL); }
这样只要把信号和处理器传给catch_signal()
函数,就能够设置信号处理器了。code
运行程序后,可使用Ctrl+C发送一个中断信号,若是想发送其余信号,能够用在终端下用kill命令,格式为kill -信号 进程号 kill -INT 1739
的效果和Ctrl+C同样,都是发送中断信号。进程
在进程内可使用raise()
函数向本身发送信号。 一般会在自定义的信号处理器中使用raise()
,这样程序就能在接收到低级别的信号时引起更高级别的信号,这叫作信号升级。get