zoukankan      html  css  js  c++  java
  • 转载--sigprocmask阻塞进程

    作者:muge0913

    链接:linux c sigprocmask阻塞进程

    1、有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。这种情况是通过阻塞信号实现的。

    2、信号阻塞和忽略信号的区别。

    阻塞的概念和忽略信号是不同的。操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃。

    3、信号阻塞系统调用,它们的都起到阻塞的作用,它们不是协作使用的。

    1. #include <signal.h>  
    2.   
    3. int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);  
    4.   
    5. int sigsuspend(const sigset_t*sigmask);  

    sigprocmask设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。

    参数:

    how:用于指定信号修改的方式,可能选择有三种

    SIG_BLOCK//将set所指向的信号集中包含的信号加到当前的信号掩码中。即信号掩码和set信号集进行或操作。

    SIG_UNBLOCK//将set所指向的信号集中包含的信号从当前的信号掩码中删除。即信号掩码和set进行与操作。

    SIG_SETMASK //将set的值设定为新的进程信号掩码。即set对信号掩码进行了赋值操作。

    set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。

    oldset:也是指向信号集的指针,在此存放原来的信号集。可用来检测信号掩码中存在什么信号。

    返回说明:

    成功执行时,返回0。失败返回-1,errno被设为EINVAL。

    sigprocmask示例(演示添加信号掩码):

    1. #include <stdio.h>  
    2. #include <signal.h>  
    3. void checkset();  
    4.   
    5. void main()  
    6. {  
    7.      sigset_tblockset;  
    8.      sigemptyset(&blockset);  
    9.      sigaddset(&blockset,SIGINT);  
    10.      sigaddset(&blockset,SIGTSTP);  
    11.   
    12.      checkset();  
    13.   
    14.      sigprocmask(SIG_SETMASK,&blockset,NULL);  
    15.      checkset();  
    16.   
    17.      sigaddset(&blockset,SIGTERM);  
    18.      sigprocmask(SIG_BLOCK,&blockset,NULL);  
    19.      checkset();  
    20.   
    21.      sigdelset(&blockset,SIGTERM);  
    22.      sigprocmask(SIG_UNBLOCK,&blockset,NULL);  
    23.      checkset();  
    24. }  
    25.   
    26. void checkset()  
    27. {  
    28.   
    29.      sigset_tset set;  
    30.      printf("checksetstart: ");  
    31.   
    32.      if(sigprocmask(0,NULL,&set)<0)  
    33.      {  
    34.      printf("checksetsigprocmask error!! ");  
    35.      exit(0);  
    36.      }  
    37.   
    38.      if(sigismember(&set,SIGINT))  
    39.      printf("sigint ");  
    40.      if(sigismember(&set,SIGTSTP))  
    41.      printf("sigtstp ");  
    42.   
    43.      if(sigismember(&set,SIGTERM))  
    44.      printf("sigterm ");  
    45.       printf("checksetend ");  
    46. }  

    sigprocmask示例(演示添某部分代码不被信号打搅):

      1. #include <stdio.h>  
      2. #include <signal.h>  
      3. void checkset();  
      4.   
      5. void func();  
      6. void main()  
      7. {  
      8.      sigset_tblockset,oldblockset,pendmask;  
      9.      printf("pid:%ld ",(long)getpid());  
      10.   
      11.      signal(SIGINT,func); //信号量捕捉函数,捕捉到SIGINT,跳转到函数指针func处执行  
      12.   
      13.     sigemptyset(&blockset); //初始化信号量集  
      14.     sigaddset(&blockset,SIGTSTP); //将SIGTSTP添加到信号量集中  
      15.     sigaddset(&blockset,SIGINT);//将SIGINT添加到信号量集中  
      16.   
      17.    sigprocmask(SIG_SETMASK,&blockset,&oldblockset); //将blockset中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字  
      18.   
      19.      /*执行以下程序时,不会被信号打搅*/  
      20.     checkset();  
      21.     sleep(5);  
      22.      sigpending(&pendmask); //检查信号是悬而未决的  
      23.      if(sigismember(&pendmask,SIGINT)) //SIGINT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理  
      24.          printf("SIGINTpending ");  
      25.   
      26.      /*免打搅结束*/  
      27.   
      28.      sigprocmask(SIG_SETMASK,&oldblockset,NULL); //恢复被屏蔽的信号SIGINT SIGTSTP  
      29.      printf("SIGINTunblocked ");  
      30.      sleep(6);  
      31. }  
      32.   
      33. void checkset()  
      34. {  
      35.      sigset_tset;  
      36.      printf("checksetstart: ");  
      37.      if(sigprocmask(0,NULL,&set)<0)  
      38.      {  
      39.      printf("checksetsigprocmask error!! ");  
      40.      exit(0);  
      41.      }  
      42.      if(sigismember(&set,SIGINT))  
      43.      printf("sigint ");  
      44.   
      45.      if(sigismember(&set,SIGTSTP))  
      46.      printf("sigtstp ");  
      47.   
      48.      if(sigismember(&set,SIGTERM))  
      49.      printf("sigterm ");  
      50.   
      51.      printf("checksetend ");  
      52.   
      53. }  
      54. void func()  
      55. {  
      56.      printf("hellofunc ");  
      57. }  
  • 相关阅读:
    C# WinForm程序中强制退出程序以及启动程序
    WinForm程序中对关闭按钮的操作
    DataTable转换为List
    json日期转换
    ajax局部刷新
    程序暂停或延迟几秒再次运行
    分页显示的制作流程
    Django 项目基础操作总结
    Django初识
    Mysql有关分页的操作
  • 原文地址:https://www.cnblogs.com/flyingdirt/p/4262554.html
Copyright © 2011-2022 走看看