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

in 默认分类 with 0 comment

新旧信号处理

在学习信号处理的时候有遇到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_mask

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

Responses