Linux信号处理函数sigprocmask()使用方法讲解

我们看一下sigprocmask()函数的使用方法.

下面我们再写一个简单的例子来熟悉sigprocmask()函数及其配套使用函数.

SIG_UNBLOCK参数的使用:

#include <signal.h>  

#include <stdio.h>  

#include <stdlib.h>  

int main()

{

    int i;

    sigset_t newmask, oldmask;

    i = 1;

    while(i <= 3)

     {

      sleep(1);

      i += 1;

     }

    sigemptyset(&newmask);

    sigaddset(&newmask, SIGINT);

    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)   

     { 

        fprintf(stderr, "SIG_BLOCK error\n"); 

        exit(1); 

     }

    else

     {

      printf("SIGINT blocked.\n");

     }

    i = 1;

    while(i <= 5)

     {

      sleep(1);

      i += 1;

     }

    printf("--------------------------------------\n");

    if(sigprocmask(SIG_UNBLOCK, &newmask, NULL) < 0)

     {

      fprintf(stderr, "SIG_UNBLOCK error\n");

     }

    else

     {

      printf("SIGINT unblocked.\n");

     }

    while(1);

}

在3s内按下组合键Ctrl + C.

 

在3s~8s中按下组合键Ctrl + C.

在这种情况下,我们看到了阻塞信号和屏蔽信号的区别.

这里在SIGINT信号阻塞后再向进程发送该信号,该信号会阻塞,直到下面第一个参数为UNBLOCK的sigprocmask()函数成功执行,这时刚才的SIGINT信号会立即传送到该进程:所以,SIGINT Unblocked未输出,进程就结束了.

 

在8s后按下组合键Ctrl + C.

 

SIG_SETMASK参数的使用:

#include <signal.h>  

#include <stdio.h>  

#include <stdlib.h>  

int main()

{

    int i;

    sigset_t newmask1, newmask2, oldmask;

    i = 1;

    while(i <= 3)

     {

      sleep(1);

      i += 1;

     }

    sigemptyset(&newmask1);

    sigemptyset(&newmask2);

    sigaddset(&newmask1, SIGINT);

    sigaddset(&newmask2, SIGQUIT);

    if (sigprocmask(SIG_BLOCK, &newmask1, &oldmask) < 0)  

     { 

        fprintf(stderr, "SIG_BLOCK error\n"); 

        exit(1); 

     }

    else

     {

      printf("SIGINT blocked.\n");

     }

    i = 1;

    while(i <= 5)

     {

      sleep(1);

      i += 1;

     }

    printf("--------------------------------------\n");

    if(sigprocmask(SIG_SETMASK, &newmask2, NULL) < 0)

     {

      fprintf(stderr, "SIG_SETMASK error\n");

     }

    else

     {

      printf("SIGINT unblocked and SIGQUIT blocked.\n");

     }

    while(1);

}

8s后,SIGINT信号由阻塞状态变为正常,SIGQUIT信号由正常变为阻塞状态.

 

发布了255 篇原创文章 · 获赞 38 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览