栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Linux C++ 通信 - 信号集(信号屏蔽字)的简单认知

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux C++ 通信 - 信号集(信号屏蔽字)的简单认知

Linux C++ 通信 - 信号集(信号屏蔽字)的简单认知

明镜止水,长话短说。


目录
  • Linux C++ 通信 - 信号集(信号屏蔽字)的简单认知
    • 信号集(信号屏蔽字)的引入
      • 对其连续发送相同信号
      • 使用不同信号

信号集(信号屏蔽字)的引入

对于一个进程,收到一个SIGUSR1信号,开始执行对应信号处理函数,尚未执行结束时,突然又收到一个SIGUSR1信号,系统会不会再次执行相应信号处理函数呢?一般不会,也就是说,当收到某个信号时并执行相应信号处理函数时,通常会屏蔽/阻塞其后的相同信号,直到信号处理函数执行完毕。

一样,先来段简单的C++代码:

#include
#include
#include
#include
using namespace std;

void sig_accept(int sig){
    if ( sig == SIGUSR1 ){
        printf("收到SIGUSR1信号, 开始休眠5s!n");
        sleep(5);
        printf("SIGUSR1信号, 休眠5s结束!n");
    }else if ( sig == SIGUSR2 ){
        printf("收到SIGUSR2信号, 开始休眠5s!n");
        sleep(5);
        printf("SIGUSR2信号, 休眠5s结束!n");
    }else{
        printf("Nothing!n");
    }
}

int main(int argc, char * const * argv){
    printf("程序开始执行!n");

    if ( signal(SIGUSR1, sig_accept) == SIG_ERR ){
        printf("无法捕获SIGUSR1n");
    }
    if ( signal(SIGUSR2, sig_accept) == SIG_ERR ){
        printf("无法捕获SIGUSR2n");
    }

    while(1){
        sleep(5);
        printf("进程休眠5s中!n");
    }
    return 0;
}

编译执行:

root@ubuntu:/home/qiye# g++ -o t144 /mnt/hgfs/c/t144.cpp 
root@ubuntu:/home/qiye# ./t144
程序开始执行!
进程休眠5s中!
对其连续发送相同信号
root@ubuntu:/home/qiye# ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 'PID|t144'
    PID    PPID     SID TT          PGRP COMMAND         STAT
  25878    2960    2763 pts/0      25878 t144            S+
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# 

其结果为:

root@ubuntu:/home/qiye# ./t144
程序开始执行!
进程休眠5s中!
进程休眠5s中!
收到SIGUSR1信号, 开始休眠5s!
SIGUSR1信号, 休眠5s结束!
收到SIGUSR1信号, 开始休眠5s!
SIGUSR1信号, 休眠5s结束!
进程休眠5s中!
进程休眠5s中!
进程休眠5s中!
进程休眠5s中!

可以发现,明明发了五次信号,却只是执行两次信号函数

使用不同信号
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr2 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878
root@ubuntu:/home/qiye# kill -usr1 25878

其结果:

进程休眠5s中!
进程休眠5s中!
收到SIGUSR1信号, 开始休眠5s!
收到SIGUSR2信号, 开始休眠5s!
SIGUSR2信号, 休眠5s结束!
SIGUSR1信号, 休眠5s结束!
收到SIGUSR1信号, 开始休眠5s!
SIGUSR1信号, 休眠5s结束!
进程休眠5s中!
进程休眠5s中!
进程休眠5s中!
进程休眠5s中!

结论:

  • 进程收到一个信号执行信号函数尚未结束时,系统会自动建立这个信号的信号屏蔽字,再收到一个相同信号,会将其阻塞到对前一个信号的处理结束为止;而不同信号却不会,因为没有对应的信号屏蔽字,所以可以直接执行相应信号处理函数。
  • 当一个信号拥有信号屏蔽字时,无论再收到多少个相同信号,到最后都只会阻塞成一个。
  • 信号执行和退出有一个先后顺序问题,好比栈结构,后收到的信号,对应的信号处理函数先结束。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号