博客搬家,原地址:https://langzi989.github.io/2018/01/28/Unix信号之sigaction函数/
sigaction函数是除signal函数之外的另一个可以设置信号处理的函数。sigaction用法比signal函数复杂,但是可以对信号处理进行更加精准更灵活的控制。sigaction是POSIX的信号接口,而signal函数是标准C的信号接口,所以sigaction函数的可移植性更强。
sigaction函数说明
函数功能
检查或修改与指定信号相关联的处理动作,可以同时检查和修改。
函数原型
struct sigaction{
void (*sa_handler)(int); //信号处理函数地址
sigset_t sa_mask; //信号掩码集,当调用信号处理函数时,程序将阻塞sa_mask中的信号
int sa_flag; //位掩码,指定用于控制信号处理过程中的各种选项。
void (*sa_sigaction)(int,siginfo_t*,void*); //暂不用
};
int sigaction(int signo,const struct sigaction*restrict act,struct sigaction*restrict oact);
函数参数
-
signo : 指定操作的信号
-
act : 新修改的sigaction
-
oldact : 保存该函数原有的sigaction。
上述struct sigaction中sa_flag取值说明(常用的有以下两个):
- SA_NODEFER:当信号处理函数正在进行时,不堵塞对于信号处理函数自身信号功能。
- SA_RESETHAND:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数
函数返回值
- 0 : 返回0表示设置成功
- -1 : 返回-1表示设置失败
函数示例
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
void sighandler(int sig) {
printf("this is in the sig handler\n");
for (int i = 0; i < 5; i++) {
printf("num:%d\n", i);
}
}
int main() {
struct sigaction act;
struct sigaction oldact;
act.sa_handler = sighandler;
act.sa_flags = SA_NODEFER ;//| SA_RESETHAND;
sigaction(SIGINT , &act,&oldact);
printf ("this is the main function\n");
pid_t pid = getpid();
printf("%d", pid);
kill(pid, SIGINT);
}
**