信号(signal)就是告知某个进程发生了某个事件的通知;信号通常是异步发生的,也就是说接受信号的进程不知道信号的准确
发生时刻;信号可以
(1)由一个进程发给另一个进程;
(2)由内核发给某个进程
每个信号都有一个与之关联的处置,即收到特定信号时的处理方法;可以通过调用sigaction函数来设定一个信号的处置
处置方法有三种:
(1)提供一个函数,只要有特定信号发生它就被调用,这样的函数称为信号处理函数,这种行为称为捕获信号;有两个信号SIGKILL和
SIGSTOP不能被捕获;信号处理函数由信号值这个单一的整数参数来调用,且没有返回值,其函数原型如下:
void handler(int signo);
(2)可以把某个信号的处置方法设定为SIG_IGN来忽略它;SIDKILL和SIDSTOP这两个信号不能被忽略;
(3)可以把某个信号的处置方法设定为SIG_DEF来启用它的默认处置;有个别信号的默认处置为忽略,如SIGCHLD和SIGURG
#include <signal.h> typedef void Sigfunc(int); Sigfunc *signal(int signo, Sigfunc *func) { struct sigaction act, oact; act.sa_handler = func; /* 设置处置方法 */ sigemptyset(&act.sa_mask); /* 把sa_mask置为空集,在信号处理期间不阻塞额外的信号 */ act.sa_flags = 0; if (signo == SIGALRM) { #ifdef SA_INTERRUPT act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */ #endif } else { #ifdef SA_RESTART act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD */ #endif } if (sigaction(signo, &act, &oact) < 0) { return SIG_ERR; } return (oact.sa_handler); }
原文:https://www.cnblogs.com/soldierback/p/10690783.html