Linux——信号处理函数sigaction()
sigaction()
作用:设置某信号的信号处理函数
1. sigaction()函数原型
#include <signal.h>
int sigaction ( int signo,
const struct sigaction* restrict act,
struct sigaction* restrict oldact
);
1
2
3
4
5
signo:指定的信号,可以为除SIGKILL 及SIGSTOP外的任何信号
act:信号处理方式
oldact:旧的信号处理方式 将存储到此指针指向的结构体中
sigaction()函数只能在POSIX支持的系统上使用(POSIX:Portable Operating System Interface of UNIX,可以指操作系统接口。其定义了操作系统应该为应用程序提供的标准接口)
2. sigaction结构体
struct sigcation
{
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t*, void*);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
1
2
3
4
5
6
7
8
sa_handler:与signal()函数的handler参数相同,主要用于对signal()信号的支持
sigaction:新的信号处理函数指针。该信号处理函数应带有三个参数,类型分别为int,struct siginfo,void,返回值为void。
– 第一个参数为信号值;
– 第二个参数为指向结构体siginfo的指针,此结构体中包含信号的信息;
– 第三个参数没有使用
sa_mask:信号集,执行信号处理函数时,暂时将信号集中的信号搁置。默认为当前信号。
sa_flags:标志位,用于设置信号处理的其他相关操作
– SA_SIGINFO:使用sa_sigaction作为信号处理函数
– SA_NODEFER:在执行信号处理函数时,不阻塞当前信号
– SA_RESETHAND:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数
– SA_RESTATR:由此信号中断的系统调用会自动重启
– SA_INTERRUPT:由此信号中断的系统调用不会自动重启
– 其他
sa_restorer:此参数没有使用
3. siginfo结构体
struct siginfo {
int si_signo; /* signal number */
int si_errno; /* if nonzero, errno value from <errno.h> */
int si_code; /* additional info (depends on signal) */
pid_t si_pid; /* sending process ID */
uid_t si_uid; /* sending process real user ID */
void *si_addr; /* address that caused the fault */
int si_status; /* exit value or signal number */
long si_band; /* band number for SIGPOLL */
/* possibly other fields also */
};
1
2
3
4
5
6
7
8
9
10
11
4. 应用示例
/*sigcation() test*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_handle(int, siginfo_t*, void *);
int main()
{
struct sigaction act;
int sig;
//设置结构体sigaction的值
sigemptyset(&act.sa_mask);
act.sa_flags=SA_SIGINFO; //使用sa_sigaction作为信号处理函数
act.sa_sigaction=new_handle;
//设置要捕捉的信号
sig=SIGINT;
if(sigaction(sig, &act, NULL)<0)
{
perror("install signal error");
return -1;
}
while(1)
{
sleep(2);
printf("wait for the signal\n");
}
return 0;
}
//信号处理函数
void new_handle(int signo, siginfo_t* siginfo, void *rest)
{
printf("new handle get a signo ~\n");
exit(0);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
运行结果:
每隔两秒打印一次“wait for the signal”,在键盘上按下CTRL+C后,跳到new_handle()函数里打印“new handle get a signo~”之后再退出。
参考:
信号之sigaction函数
sigaction用法实例
sigaction函数解析
sigaction函数使用实例
Linux 进程------sigaction 函数解析
POSIX
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/iknow_nothing/article/details/84306084