sigprocmask: 用于随时添加信号屏蔽字 ; sigaction : signal增强版本, 当处理信号时, 可以随意添加信号屏蔽字 sigset_t newmask,oldmask,pendmask info->si_pid,info->si_value.sival_int); } int main(int argc , char ** argv , char ** env) { struct sigaction act,oact; sigemptyset(&act.sa_mask); act.sa_flags =SA_SIGINFO; act.sa_sigaction = sig_handler ; //act.sa_mask 用于屏蔽信号,当 sig_handler 被处理时 sigaction(SIGUSR2,&act,&oact); pid_t pid = getpid (); printf("parent : %d\n", pid); if(fork() == 0){ //子进程继承父进程 sigaction
而 POSIX 标准定义的信号处理接口是 sigaction 函数,其接口头文件及原型如下: #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); ◆ signum:要操作的信号。 struct sigaction 类型用来描述对信号的处理,定义如下: struct sigaction { void (*sa_handler)(int); void 成员 sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。 在某些系统中,成员 sa_handler 与 sa_sigaction 被放在联合体中,因此使用时不要同时设置。
函数sigaction 原型:int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact); @signo 信号编号 @act 要注册的信号动作 @oact 原信号动作 参数 struct sigaction struct sigaction{ void (*sa_handler)(int); sigset_t sa_mask; int sa_flag; void (sa_sigaction)(int,siginfo_t ,void *); }; sa_haddler or sa_sigaction sa_handler & sa_sigaction 信号处理函数的指针,二者用其一:如果sa_flags中存在SA_SIGINFO 标志,那么sa_sigaction将作为signum信号的处理函数。
sigaction 原型: int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact); @signo 信号编号 @act 要注册的信号动作 @oact 原信号动作 参数 struct sigaction struct sigaction{ void ( *sa_handler)(int); sigset_t sa_mask; int sa_flag; void (sa_sigaction)(int,siginfo_t ,void *); }; sa_haddler or sa_sigaction sa_handler & sa_sigaction 信号处理函数的指针,二者用其一:如果sa_flags中存在SA_SIGINFO标志 ,那么sa_sigaction将作为signum信号的处理函数。
signal_oact(int sign) { printf(“Test:in signal_oact”); } void signal_set() { struct sigaction act.sa_flags = 0; //oact old_act.sa_handler = signal_oact ; // if(sigaction (SIGHUP,&act,&old_act) <0) { printf(“FATAL errorfor sigaction in function signal_set \n”); exit(-1); } sigaction(SIGSEGV,&act,NULL); sigaction(SIGINT ,&act,&old_act); sigaction(SIGTERM,&act,NULL); sigaction(SIGQUIT,&act,NULL); return
1. sigaction int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); signum :可以指定SIGKILL和SIGSTOP以外的所有信号 2. struct sigaction struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags 举例 struct sigaction act, oact; act.sa_sigaction = sig_handler; sigemptyset(&act.sa_mask); //清空此信号集 act.sa_flags = SA_SIGINFO; //信息传递开关 sigaction(SIGCHLD, &act, &oact); //sigaction(SIGINT, &oact, NULL); //恢复成原始状态
signal和sigaction的区别: signal都是指以前的older signal函数,现在大多系统都用sigaction重新实现了signal函数。 1. signal在调用handler之前先把信号的handler指针恢复;sigaction调用之后不会恢复handler指针,直到再次调用sigaction修改handler指针。 这样,signal就会丢失信号,而且不能处理重复的信号,而sigaction就可以。 sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。 #include<signal.h> intsigaction(int signo, const struct sigaction* act,struct sigaction* oact) ; 其中
关于发送信号和sigaction见下节 我好累阿,回去睡觉。
Address: %p\n", siginfo->si_addr); dump_backtrace(); exit(-1); } int main() { int ret = 0; struct sigaction act; act.sa_flags = SA_SIGINFO; act.sa_sigaction = siginfo_handler; sigemptyset(&act.sa_mask); ret = sigaction(SIGSEGV, &act, NULL); if(0 ! = ret) { perror("sigaction() failed"); } test(); return 0; } 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
一、函数原型:sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, const struct sigaction *act 二、 struct sigaction结构体介绍 struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int 而 POSIX 标准定义的信号处理接口是 sigaction 函数,其接口头文件及原型如下: #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); ◆ signum:要操作的信号。 struct sigaction 类型用来描述对信号的处理,定义如下: struct sigaction { void (*sa_handler)(int); void (*
先来看这两个函数的区别和实验: 一、实验 1、signal比sigaction简单,但signal注册的信号在sa_handler被调用之前把会把信号的sa_handler指针恢复,而sigaction ,因为是用sigaction注册的,所以也是意料之中。 3、sigaction控制粒度更细,可以设置sigaction里面的sa_mask、sa_flags,比signal支持更多功能,可参考man,这里实验就免了。 分别用strace跟踪一下实验一和实验二的二进制程序: 可以看出signal是调用rt_sigaction来实现的(上图红框所示),上面这两个图的主要区别是rt_sigaction函数第二个参数的标志位 二、信号安装 既然signal和sigaction最终都是调了系统调用rt_sigaction,那就得剖析一下rt_sigaction源码是怎么实现的了: 上面代码中,rt_sigaction主要是调用
1. sigaction 函数 不同于 signal 函数,sigaction 函数是符合 POSIX 标准的,而 signal 只是 ANSI C 定义的函数。 ##1.1 函数原型 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 参数 signum 参数 act:struct sigaction 结构体,它保存了信号处理函数指针等等,后面具体讲解。 参数 oldact:返回旧的 struct sigaction 结构体。 ", 1); pause(); } return 0; } 编译和运行 $ gcc sigaction.c -o sigaction $ . 总结 掌握 sigaction 函数使用方法 掌握 struct sigaction 结构体 理解 sigaction 结构体中 sa_mask 成员的含义 发布者:全栈程序员栈长,转载请注明出处:https
二、sigaction函数 #include <signal.h> int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); sigaction函数可以读取和修改与指定信号相关联的处理动作。 act和oact指向sigaction结构体: struct sigaction { void (*sa_handler)(int); 其实我们在前面文章说过的signal 函数是调用sigaction 实现的,而sigaction函数底层是调用 do_sigaction() 函数实现的。 sa_flags 和 sa_sigaction 参数的示例看这里。
5.2 sigaction 函数:核心接口详解 sigaction函数用于查询或设置信号的处理动作,是 POSIX 标准定义的信号捕捉核心接口。 5.2.1 函数原型 #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction 5.3 核心结构体:struct sigaction(信号捕捉的 “配置中心”) struct sigaction是sigaction函数的核心,包含了信号处理的所有配置项,定义如下: struct -o sigaction_basic . signal 和 sigaction 的区别?为什么推荐使用 sigaction?
#include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact ); // sigaction 结构体 struct sigaction { void (*sa_handler)(int); void (*sa_sigaction 如果不需要保存原先的信号处理方式,可以将其设置为 NULL 返回值:调用成功则返回0,出错则返回-1 sigaction 本质就是修改信号的handler表 sigaction 跟前面的signal本质作用是一样的 ,都是对特定信号进行捕捉 调用成功则返回0,出错则返回-1 sigaction 本质就是修改信号的handler表 sigaction 跟前面的signal本质作用是一样的,都是对特定信号进行捕捉 sa_nandler 因此,sigaction 是一种更现代、更稳定的信号处理方法,建议在新代码中使用它。 2.
因此应该尽量避免使用它,取而代之使用sigaction函数。 函数参数 signum:要捕捉的信号编号。 函数 包含头文件及函数原型 #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction (用于恢复原始动作) struct sigaction 结构体 struct sigaction { void (*sa_handler)(int); void ( (弃用) sa_sigaction 当sa_flags被指定为SA_SIGINFO标志时,使用该信号处理程序。 使用示例:使用sigaction捕获信号 /************************************************************ >File Name : sigaction_test.c
相比,sigaction更加健壮。 结构体sigaction: struct sigaction { //信号的响应函数 void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); //搁置信号集 sigset_t sa_mask 函数sigaction: int sigaction(int signum, const struct sigaction *act, struct 例如:结构体sigaction中的参数——sigset_t sa_mask,这个sa_mask为信号搁置集。 用sigset_t类型表示,实质是一个无符号长整形。
2.2.2 使用 sigaction() 函数(推荐方式) 功能: #include <signal.h> int sigaction(int signum, const struct sigaction act:指向 struct sigaction 结构体的指针,用于指定新的信号处理方式。若为 NULL,则不修改当前设置。 结构体 sigaction: struct sigaction { void (sa_handler)(int); // 信号处理函数 void (sa_sigaction)(int, siginfo_t (&sa.sa_mask); sigaction(SIGCHLD, &sa, NULL); // 创建子进程... 捕捉信号推荐使用sigaction,其通过结构体精细控制处理函数、信号屏蔽和标志位,支持异步安全编程。典型场景包括优雅终止、子进程管理、定时任务等。
最基本的方法是POSIX定义的sigaction() typedef unsigned long long sigset_t; union sigval { int sival_int { union { void (*__sa_handler)(int); void (*__sa_sigaction)(int, siginfo_t __sa_handler #define sa_sigaction sa_u. __sa_sigaction sigset_t sa_mask; int sa_flags; }; /* * POSIX定义的Signal处理函数的安装机制 * sig sig, struct sigaction *pAct, struct sigaction *pOact ); 或者使用简化一些的sigvec() typedef unsigned
可以使用 signal 或 sigaction 函数将信号的处理动作设置为 SIG_IGN。 \n"); sleep(1); } return 0; } ②使用 sigaction 函数 sigaction 函数比 signal 函数更强大和灵活,它可以更精确地控制信号的处理 其原型如下: #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction * act:指向 struct sigaction 结构体的指针,用于设置新的信号处理动作。 oldact:指向 struct sigaction 结构体的指针,用于保存旧的信号处理动作。 struct sigaction 结构体的定义如下: struct sigaction { void (*sa_handler)(int); void (*sa_sigaction