注册信号处理的两种方式
两个函数所在头文件都为 #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 sigfun(int args)
{
printf("%s %d start\n",__func__,__LINE__);
if(SIGINT == args)
{
printf("this signal is SIGINT");
}
else if(SIGQUIT == args)
{
printf("this signal is SIGQUIT");
}
}
int main()
{
#if 1//方法1
printf("%s %d start\n", __func__, __LINE__);
#if 0 //注册为捕获
signal(SIGINT,sigfun);
signal(SIGQUIT,sigfun);
#endif
#if 0 //注册为系统缺省处理
signal(SIGINT,SIG_DFL);
signal(SIGQUIT,SIG_DFL);
#endif
#if 1 //注册为忽略
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
#endif
int i;
for (i = 0; i < 5; i++)
{
printf("current pid = %d,i = %d\n", getpid(), i);
sleep(1);
}
printf("%s %d stop\n", __func__, __LINE__);
#endif
#if 0 //方法2
printf("%s %d start\n",__func__,__LINE__);
struct sigaction act = {0},oldact ={0};
act.sa_handler = sigfun;
act.sa_flags = SA_RESETHAND;
sigaction(SIGINT,&act,&oldact); //使用sigaction注册新的信号处理方式
int i;
for(int i= 0; i < 5 ;i++)
{
printf("current pid = %d, i= %d\n",getpid(),i);
sleep(1);
}
sigaction(SIGINT,&oldact, NULL);//还原
printf("%s %d stop\n",__func__,__LINE__);
#endif
}
本篇博文仅作个人学习记录所用。
本文探讨了系统编程中注册信号处理的两种主要方式:signal()函数和sigaction()函数。详细介绍了这两个函数的参数、用法以及它们在处理信号时的区别。通过对信号值、信号处理方式和结构体sigaction的解析,帮助读者更好地理解和应用这些概念。

被折叠的 条评论
为什么被折叠?



