对信号集相关函数的理解

本文通过一个具体的C语言示例程序,详细介绍了如何使用sigaction函数来处理信号,包括信号的注册、屏蔽、恢复等操作。通过示例程序运行的不同阶段,展示了SIGINT信号在不同情况下的行为变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文来自https://blog.youkuaiyun.com/li_wen01/article/details/54343796
对代码进行批注,加深理解

  1 #include <stdio.h>
  2 #include <signal.h>
  3 void handler(int sig)
  4 {
  5     printf("handle the signal %d\n",sig);
  6 }
  7 int main(void)
  8 {
  9     int ret;
 10     sigset_t sigset,ign;
 11     struct sigaction act;//信号的处理方式和signal函数功能相同
 12     act.sa_handler=handler;//信号的处理方式是自定义,SIN_DFL(默认),SIN_ING(忽略)
 13     sigemptyset(&act.sa_mask);
 14     act.sa_flags=0;//和前面的处理一样,基本设置
 15     sigemptyset(&sigset);//清空sigset信号集
 16     sigemptyset(&ign);   //清空ign信号集
 17     sigaddset(&sigset,SIGINT);//往sigset信号集中加入SIGINT信号
 18     sigaction(SIGINT,&act,0);//将SIGINT中的所有信号设置为act对应的处理方式。
 19     printf("wait the signal SIGINT(ctrl+c)\n");
 20     pause();//信号打断睡眠进程
 21     sigprocmask(SIG_SETMASK,&sigset,0);//将sigset中的所有信号屏蔽
 22     printf("please press ctrl+c in 20s...\n");//按ctrl+C 并不能中断sleep,信号被屏蔽了
 23     sleep(20);
 24     sigpending(&ign);//将进程挂起,将悬而未决信号放入ign信号集中
 25     if(sigismember(&ign,SIGINT))//判断SIGINT是否在ign信号集中,若在说明该信号被屏蔽了
 26         printf("the SIGINT signal has ignored\n");
 27     sigdelset(&sigset,SIGINT);//将SIGINT信号从sigset信号集中删除
 28     printf("wait SIGINT signal..\n");
 29     sigsuspend(&sigset);//暂时只屏蔽sigset信号集的信号,并挂起进程,收到非sigset信号集的信号,该函数>    就返回了,进程不再被挂起,并将sigprocmask恢复为原来所屏蔽的信号,重点(此刻SIGINT还是处于被屏蔽的状态
    ,此刻按ctrl+c还是不会调用handler函数)
 30     sigprocmask(SIG_SETMASK,&sigset,0);//重新设置屏蔽的信号集
 31     act.sa_handler=SIG_DFL;
 32     sigaction(SIGINT,&act,0);//改变SIGINT的处理方式,就不再打印"hello"
 33     printf("process will exit in 20s...\n");
 34     sleep(20);
 35     printf("hello\n");
 36     return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值