linux 系统对信号的处理,Linux下的信号处理函数总结
信号处理函数
相关函数原型如下:
#include
sighandler_t signal(int signum, sighandler_t handler);
第一参数是信号
第二个参数是信号处理器:
1.可以是SIG_DFL,信号的默认动作
2. 可以是SIG_IGN,忽略该信号
3. 一个带有一个整型参数的处理函数。
#include
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
signum 要处理的信号
act 指针,指向描述操作的结构 如何响应信号的结构体
oldact 指针,指向描述被替换操作的结构 被替换的处理设置的结构体
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
进程该如何处理信号(早期的信号处理机制):
进程可以通过signal系统调用来告诉内核该怎么去处理信号
1.接受默认处理
按照信号本来的意图区处理 signal(SIGINT,SIG_DFL)
2.忽略信号
signal(SIGINT,SIG_IGN) 忽略SIGINT信号
3.调用一个函数
signal(SIGINT,functionname)
2.早期的信号处理机制存在的问题
一:信号处理函数每次调用后都要被禁用(根据系统的不同而不不同)
二:不知道信号被发送的原因
三:处理函数中不能安全地阻塞其他信号
四:不支持信号中断,信号会被阻塞。(不同的系统可能不同)
3.POSIX信号处理函数
POSIX支持了sigaction这一类信号处理功能。也引入了一个sigaction结构体。
在该结构体中,sa_flags用于表示处理早期信号机制存在问题所需的标志位,并可通过逻辑运算来实现相应的功能。
下面仅列出部分标志位:
SA_RESETHAND 当处理函数被调用时重置而不是禁用
SA_NODEFER 关闭信号阻塞,允许递归调用信号
SA_RESTAAT 当系统调用针对一些缓慢运行的设备时, 该系统调用将被修改为重新启动而非退出
SA_SIGINFO 指定赋值给 sa_sigaction 函数,并在未设置时由 sa_handle 指示的目标函数执行;若调用时传递了该结构体,则该函数将包含触发该事件的原因及相关条件的信息。
以下一个示例将展示如何实现sigaction以阻止其他信号。
#include
#include
#include
#define INPUTLEN 100
int main ( int argc, char *argv[] )
{
struct sigaction newhandler;
#定义一个信号集
sigset_t blocked;
char x[INPUTLEN];
#设置信号处理函数
newhandler.sa_handler = inthandler;
#设置信号处理函数重置
newhandler.sa_flags = SA_RESETHAND|SA_RESTART
#清空信号集
sigemptyset(&blocked);
#添加SIGQUIT信号集
sigaddset(&block,SIGQUIT);
#设置屏蔽的信号集
newhandler.sa_mask = blocked;
#装载信号
if(sigaction(SIGINT,&newhandler,NULL) == -1)
perror("sigaction");
else
while(1){
fgets(x,INPUTLEN,stdin);
printf("INput: %s",x);
}
return EXIT_SUCCESS;
}
/* ---------- end of function main ---------- */
void inthandler (int s)
{
printf("Called with signal %d\n",s);
sleep(s);
printf("done handling signal %d\n",s);
} /* ----- end of function inthandler ----- */

