linux-信号

信号闹钟操作 alarm(n) 闹钟,等s之后跳到闹钟结束进程
linux 代码:
让进程在1s后听到闹钟停止,打印count; 如果这1s内连续打印,因为有i/o count只到十几万,但是1s中自增时候没有打印,可以到几亿;

    1 #include <stdio.h>
    2 #include <unistd.h>
    3 #include <stdlib.h>
    4 #include <sys/types.h>
    5 #include <signal.h>
    6 
    7 int count=0;
W>  8 void handler(int signo)
    9 {
   10     printf("count: %d\n",count);
   11     exit(1);                                                                                                               
   12 }
   13 
   14 int main()
   15 {
   16     signal(SIGALRM,handler);
   17     alarm(1);
   18     while(1)
   19     {
   20         count++;
   21     }
   22 }

在这里插入图片描述
raise 可以直接调用信号。
在这里插入图片描述
在这里插入图片描述

sigset_t set,oset;

#include <stdio.h>                                                                                                           
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 #include <sys/types.h>
  5 #include <signal.h>


  7 void printPending(sigset_t* pending)
    8 {
    9     int i=1;
   10     for(;i<=31;++i)
   11     {
   12         if(sigismember(pending,i))
   13         {
   14             printf("1 ");
   15         }
   16         else 
   17         {
   18             printf("0 ");
   19         }
   20     }
   21     printf("\n");
   22 }
   23 
W> 24 void handler(int signo)
   25 {
   26     printf("恢复后,收到了2号信号\n");
   27 }
   28                                                                                                                            
   29 int main()
   30 {
   31     signal(2,handler);
   32     sigset_t set, oset;
   33     sigemptyset(&set);
      34     sigemptyset(&oset);
   35     
   36     sigaddset(&set,2);  //将二好信号加入到set
   37 
   38     sigprocmask(SIG_SETMASK,&set,&oset); // 将加入了二好信号的set进行阻塞处理,oset用来接收原来未处理的set
   39 
   40     sigset_t pending;
   41     int count=0;
   42     while(1)
   43     {
   44         sigemptyset(&pending); // 初始化pending(是否递交的证明)
   45         sigpending(&pending);
   46 
   47         printPending(&pending);
   48         sleep(1);
   49         count++;
   50         if(count==10)
   51         {
   52             sigprocmask(SIG_SETMASK, &oset,NULL); //接收到2号信号之后(相当于让2号信号递交了),将pending置为初始状态。
   53             printf("恢复信号屏蔽字\n");
   54         }                                                                                                                  
   55     }
   56     
   57 }


结果如下显示:
在这里插入图片描述

二号信号传进来后,就是有1,pending阻塞住了,十秒后,我让他别阻塞了,直接接收到2号信号,pending变得没有1了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值