linux sigaction信号处理
sigaction函数相比signal函数更为复杂,但更具灵活性,下面具体介绍她的结构和用法:
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
signum:要操作的信号。
act:要设置的对信号的新处理方式。
oldact:原来对信号的处理方式。 如果不需要设置
返回值:0 表示成功,-1 表示有错误发生。
struct sigaction { union { __sighandler_t _sa_handler; void (*_sa_sigaction)(int, struct siginfo *, void *); } _u; sigset_t sa_mask; unsigned long sa_flags; void (*sa_restorer)(void); }; #define sa_handler _u._sa_handler #define sa_sigaction _u._sa_sigaction
typedef struct { int si_signo; //同处理器函数的信号编号 int si_code; union sigval si_value; //sigqueue()发送信号时伴随的数据 pid_t si_pid; long si_band; int si_fd; ... } siginfo_t;
这里给出标准信号的用法:
#include <iostream> #include <string> #include <signal.h> using namespace std; void handler( int signo, siginfo_t* info, void* context) { cout<<"catch "<<endl; if (signo == SIGINT) { cout<<"Crtl+c catched!"<<endl; sleep(3); } } int main() { struct sigaction sa; sa.sa_sigaction = handler; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); //这里处理器调用过程中不阻塞任何信号,除了调用的信号。标准信号不排队,只保留一个。 sigaction(SIGINT, &sa, NULL); while (1) { sleep(100); } return 0; }