帅帅翔 2023-04-10 14:25 采纳率: 100%
浏览 11
已结题

C语言linux屏蔽信号

设置进程/线程屏蔽信号的三种方式:

signal( ** , SIG_IGN ) 和 sigprocmask 和 pthread_sigmask

这三种方式各自有什么区别嘛,为什么我选用后两种方法测试程序(实时信号)却没有生效,线程没有处理,主进程收到实时信号反而异常直接退出了

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2023-04-10 15:12
    关注

    以下内容部分参考ChatGPT模型:


    首先,signal函数和sigprocmask函数都是用于处理进程屏蔽信号的函数,而pthread_sigmask函数则是用于处理线程屏蔽信号的函数。它们的区别在于作用对象不同。

    signal函数可以设置信号的处理方式,可以将信号忽略、捕捉或者使用默认处理方式。但是需要注意的是,signal函数只能处理一些基本的信号,例如SIGINT、SIGTERM等,不能处理实时信号。

    sigprocmask函数可以设置进程屏蔽信号的集合,可以屏蔽某些信号的处理,使得在这些信号未被解除屏蔽之前,进程不会收到这些信号。但是需要注意的是,sigprocmask函数只能屏蔽信号的接收,不能处理信号。

    pthread_sigmask函数与sigprocmask函数类似,可以设置线程屏蔽信号的集合。但是需要注意的是,pthread_sigmask函数只能屏蔽信号的接收,不能处理信号。

    针对实时信号无法被处理的问题,可能是由于实时信号的优先级较高,导致其他信号被阻塞无法处理。可以使用sigaction函数替代signal函数来处理实时信号,并使用sigprocmask或pthread_sigmask函数屏蔽其他信号的接收,以避免信号被阻塞。

    以下是一个使用sigaction函数处理实时信号的示例代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    
    void handler(int signo)
    {
        printf("receive signal %d\n", signo);
    }
    
    int main()
    {
        struct sigaction act, oldact;
    
        // 设置信号处理函数
        act.sa_handler = handler;
        sigemptyset(&act.sa_mask);
        act.sa_flags = 0;
    
        // 注册实时信号处理函数
        if(sigaction(SIGRTMIN, &act, &oldact) < 0)
        {
            perror("sigaction error");
            exit(1);
        }
    
        // 屏蔽其他信号的接收
        sigset_t newmask, oldmask;
        sigemptyset(&newmask);
        sigaddset(&newmask, SIGINT);
        sigaddset(&newmask, SIGTERM);
        sigprocmask(SIG_BLOCK, &newmask, &oldmask);
    
        while(1)
        {
            sleep(1);
        }
    
        return 0;
    }
    

    如果我的建议对您有帮助、请点击采纳、祝您生活愉快

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题