Advertisement

【信号】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)

还没有任何评论哟~