【信号】Linux信号捕捉之sigaction
发布时间
阅读量:
阅读量
由系统提供其他类型的信号处理功能 sigaction 负责检查或修改指定信号的关联处理动作。其中 sigaction 的作用是通过参数 n 来区分不同类型的功能,并根据输入 m 的值来决定具体的响应策略。
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
AI写代码
signum代表需要处理的信号编号。 act和oldact均为结构体指针类型变量。 当无需调整该信号的操作时,可将其设置为空指针;若需对动作进行捕捉处理,则可将该结构体传递进去。 oldact名称源自"old action",其含义即为"前一个操作",通过捕获当前操作以便于在后续处理完成后恢复前一状态。
linux系统下其结构体具体信息如下:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
AI写代码
sa_handler 代表返回值为空且参数类型为整数的函数指针。这表示其用于定位与特定信号相关的功能位置。若将其设置为 SIG_DFL,则会对相应信号执行默认处理;而将其设定为 SIG_IGN 则会忽略该信号处理行为。
sa_sigaction是指向另一个信号处理函数的函数指针。
sa_mask 代表/称作一个信号集,在执行信号捕捉函数的过程中(或当执行信号捕捉函数时),会对 sa_mask 中的各类信号进行过滤性屏蔽处理
若 sa_flags 包含了 SA_SIGINFO 标志,则系统将选择 sa_sigaction 函数作为其信号处理函数;否则则采用 sa_handler 作为其信号处理函数。
sa_flags 是这些值通过按位或操作组合而成的形式。
其中:
- SA_RESTART标志用于指示即使被中断的系统调用也能自动重启。
- SA_NOCLDSTOP禁止子进程中断因暂停或继续运行而触发SIGCHLD中断。
- SA_NOCLDWAIT设置确保父进程中若子进程退出则不会触发SIGCHLD中断,并且即使子进程中断也不会导致其变为僵尸进程中断。
- SA_NODEFER标志启动后会使得在执行中仍需发送该中断时无需屏蔽它。
- SA_RESETHAND指当处理完一个中断后会恢复到默认的行为模式。
- 当处理完一个中断事件就恢复为常规操作模式的就是SA_RESETHAND标志。
最后: - 将使用 sa_sigaction 成员而非 sa_handler 来实现中断处理功能的是 SA_SIGINFO标志。
通常 将sa_flags设置为0.
sa_restorer在设计之初就不是打算给用户使用的,所以编程时不关心
sigaction函数的行为与信号部分函数一致,在正常情况下将返回整数值0;当出现错误时,则会将整数值-1作为返回结果,并通过变量errno来记录具体错误信息
#include "apue.h"
typedef void Sigfun(int);
void
docatch(int signo)
{
printf("docatch catch signal is %d\n",signo);
}
int
main(int argc,char **argv)
{
struct sigaction act;
act.sa_handler = docatch;
sigemptyset(&act.sa_mask);
// sigaddset(&act.sa_mask,SIGQUIT);
act.sa_flags = 0;
if(sigaction(SIGINT,&act,NULL) == -1){
printf("sigaction error\n");
exit(1);
}
printf("sigaction success\n");
while(1);
return 0;
}
AI写代码
全部评论 (0)
还没有任何评论哟~
