首页 » 默认分类 » 正文

[Linux Signal] 新旧信号的处理方式 sigaction – 刘傲天

新旧信号处理

在学习信号处理的时候有遇到signal函数,这个函数一般是三种处理方式分别是默认处理方式和忽略的处理方式还有一项则是由你自定义处理方式,但是这个自定义的处理方式是受限制的,他只可以有一个参数,并且这个参数不是由你来解决传递的,而是直接传递过去的一个信号值。

为什么使用新的信号处理

大多数东西学习的时候都学习最新的可以很快的上手并且功能更加的全面这是准没有错的,更何况这个旧的没有什么差别,并且比旧的功能要强大。

sigaction

函数原型

struct sigaction{
    void (*sa_handler)();
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;

新旧处理机制

使用旧的处理机制

struct sigaction demo;
demo.sa_handler = handler_old;

这是旧的处理方式,接下来是新的

struct sigaction demo;
demo.sa_sigaction = handler_new;

可以看的出来他两者的差别真的是非常的小
那么既然是使用的结构体,内核是如何知道你使用的是新的处理方式还是旧的呢,难道是判断是否赋值?当然不是这样,可以通过设置sa_flags来控制使用旧的还是新的处理方式

sa_flags控制处理

  • SA_RESETHAND 当处理函数被调用时重置 也就是捕鼠器模式下边会讲什么是捕鼠器模式
  • SA_NODEFER 在处理信号时关闭信号自动阻塞,这样允许递归调用信号处理函数,也就是一直接受信号处理
  • SA_RESTART 当系统调用是针对一些慢速的设备或类似的系统调用,重新开始,而不是返回,采用BSD模式
  • SA_SIGINFO 指明使用sa_sigaction的处理函数的值,如果这个位没有被设置则会处理sa_handler指向的处理函数的值,如果sa_sigaction被使用也就是我们所说的新的处理方式,他传递过去的就不止有信号的编号还有产生信号的原因和条件的结构体

sa_mask

sa_mask中的位指定是否要在处理一个消息的时候阻塞其他的信号,他的位则代表哪些信号要被阻塞,阻塞信号是非常重要的一个环节。

发表评论