注册信号处理的两种方式
两个函数所在头文件都为 #include<signal.h>
1.signal()函数
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
- @signum:信号值 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11)
SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16)
SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21)
SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26)
SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31)
SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38)
SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42)
SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46)
SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50)
SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54)
SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58)
SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62)
SIGRTMAX-2 63)
SIGRTMAX-1 64) SIGRTMAX
@handler:信号处理方式,值可以为
#define SIG_DFL 0 /* 注册为系统默认处理,Default action. /
#define SIG_IGN 1 / 注册为忽略:删除信号Ignore signal. / (1能用 但是有警告)
还可以使用类型为 void ()(int)的函数名
返回值:旧处理方式
2. sigaction函数
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
@signum:信号值
@act:要设置的信号处理方式
@oldact:保存旧处理方式
struct sigaction {
void (*sa_handler)(int); //SIG_DFL,SIG_IGN,信号处理函数名
void (*sa_sigaction)(int, siginfo_t *, void *); //当sa_flags为SA_SIGINFO
sigset_t sa_mask; //屏蔽信号集(不会删除会存入搁置信号集):与忽略不同(会删除)
int sa_flags; //标志位:SA_RESTART:重新调用系统调用,SA_INTERRUPT:中断 SA_SIGINFO:查询
void (*sa_restorer)(void);
};
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void