sigaction 的函数原型:
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
函数用途: 用于注册指定的signum 的处理函数
signum: 定义在signal.h 中,如:SIGABRT、SIGUSR1、SIGPOLL等
act: 新设定的信号处理参数
struct sigaction {
void (*sa_handler)(int); //信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); //更复杂的信号处理
sigset_t sa_mask; //设置在sa_handler处理过程中阻塞的信号mask
int sa_flags; //
void (*sa_restorer)(void); //已经废弃
};
sa_flags 标志选项:可以通过 | 进行多选
SA_RESTART: 让中断的系统调用,重新执行。 当出发信号处理函数时会中断read 、write 等系统调用函数,设置该标志位可以让系统重新执行
SA_SIGINFO: 使用sa_sigaction 作为处理函数,有更详细的信号处理信息
SA_NOCLDSTOP: 在子进程停止或继续时,主进程将不会收到子进程的启动或停止的信号
oldact: 旧的信号处理参数
当信号产生时,如果是单线程,将停止当前线程运行,信号处理函数执行完成后恢复线程执行。
如果是多线成,根据系统调度器确定在哪个线程上执行信号处理函数。如果一个线程存在阻塞的系统调用、或者使用pthread_sigmask 在当前线程上阻塞信号。则系统调度器会将信号处理分配给其它的线程执行。
另外SIGINT 、SIGTERM 如果注册了信号处理函数,则程序不会被自动终止