信号屏蔽的切换的理解sigsuspend

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handle(int s)
{
        printf("外部用户中断处理...!
");
        sleep(5);
        printf("外部用户中断处理结束!
");
}

main()
{
        int sum=0;
        int i;
        sigset_t sigs,sigt,sigu;
        sigemptyset(&sigs);
        sigemptyset(&sigt);
        sigemptyset(&sigu);
        sigaddset(&sigs,SIGINT);
        sigaddset(&sigs,SIGUSR1);//
        signal(SIGINT,handle);
        sigprocmask(SIG_BLOCK,&sigs,0);
        for(i=0;i<10;i++)
        {
        printf("正在拷贝电影<%d>!
",i);
        sleep(7);//模拟业务处理时间比较长
        printf("电影拷贝完毕<%d>!
",i);
        sigpending(&sigu);
        if(sigismember(&sigu,SIGINT))
        {
        sigsuspend(&sigt);
        }

        }
        printf("所有电影拷贝完毕
",sum);
        printf("over!
");
        sigprocmask(SIG_UNBLOCK,&sigs,0);
}

sigsuspend(sigset_t  sigs);功能: 屏蔽新的信号,原来屏蔽的信号失效。sigsuspend是阻塞函数,对参数信号屏蔽,对参数没有指定的信号不屏蔽,但当没有屏蔽的信号处理函数调用完毕sigsuspend函数返回。

sigsuspend返回条件:

  1. 信号发生,并且信号是非屏蔽信号
  2. 信号必须要处理,而且处理函数返回后sigsuspend才返回。

sigsuspend设置新的屏蔽信号,保存旧的屏蔽信号,而且当sigsuspend返回的时候,恢复旧的屏蔽信号。

其实可以这样理解:sigsuspend=pause()+指定屏蔽的信号

原文地址:https://www.cnblogs.com/huacw/p/3579411.html