函数sigaction

42 篇文章 21 订阅

函数sigaction、signal

struct sigaction 结构体

struct sigaction
{
    void(*sa_handler)(int);//不带附加参数的信号处理函数指针
    void(*sa_sigaction)(int, siginfo_t *, void *);//带有附加参数的信号处理函数指针(两个信号处理函数指针只能二选一)
    sigset_t sa_mask;//在执行信号处理函数时,应该屏蔽掉哪些信号
    int sa_flags;//用于控制信号行为,它的值可以是下面选项的组合
    //SA_SIGINFO:如果指定该选项,则向信号处理函数传递参数(这时应该使用 sa_sigaction 成员而不是 sa_handler).
    void(*sa_restorer)(void);//该成员在早期是用来清理函数栈的,如今已被废弃不用。
};

函数sigaction原型

/*
参数 signum :要捕获的信号。
参数act:truct sigaction 结构体,后面具体讲解传入参数,新的处理方式
参数oldact:返回旧的 struct sigaction 结构体,传出参数,旧的处理方式
*/
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

测试代码

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
void printsigset(const sigset_t *set)
{
    for (int i = 1; i <= 64; i++)  {
        if (i == 33) putchar(' ');
        if (sigismember(set, i) == 1)
            putchar('1');
        else
            putchar('0');
    }
    puts("");
}
void handler(int sig)
{
    if (sig == SIGTSTP)
        printf("hello SIGTSTP\n");
    if (sig == SIGINT)
        printf("hello SIGINT\n");
    sleep(5);
    sigset_t st;
    sigpending(&st);
    printsigset(&st);
}
int main()
{
    printf("I'm %d\n", getpid());
    struct sigaction act, oldact;
    act.sa_handler = handler;   // 设置普通信号处理函数
    sigemptyset(&act.sa_mask);  // 向 sa_mask 中添加 SIGINT
    sigaddset(&act.sa_mask, SIGINT);
    act.sa_flags = 0; // 先置 0
    sigaction(SIGTSTP, &act, &oldact);
    sigaction(SIGINT, &act, &oldact);
    while (1)  {
        write(STDOUT_FILENO, ".", 1);
        pause();
    }
    return 0;
}
/*
1、当程序运行的时候,Ctrl C 进入 handler,然后立即 Ctrl Z 发现 handler 还未执行完就被 SIGTSTP 打断。
2、当程序运行的时候,Ctrl Z 进入 handler,然后立即 Ctrl C 发现并不会被 SIGINT 打断,这是因为该 handler 
注册的时候被设置了 SA_MASK = SIGINT。最后 handler 结束的时候打印了未决信号集,发现里头有 SIGINT。
所以 handler 结束后,又去继续对 SIGINT 进行处理。
*/
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值