信号屏蔽的切换的理解sigsuspend

 

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <unistd.h>

void handle(int s)

{

        printf("外部用户中断处理...!\n");

        sleep(5);

        printf("外部用户中断处理结束!\n");

}



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>!\n",i);

        sleep(7);//模拟业务处理时间比较长

        printf("电影拷贝完毕<%d>!\n",i);

        sigpending(&sigu);

        if(sigismember(&sigu,SIGINT))

        {

        sigsuspend(&sigt);

        }



        }

        printf("所有电影拷贝完毕\n",sum);

        printf("over!\n");

        sigprocmask(SIG_UNBLOCK,&sigs,0);

}

 

 

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

sigsuspend返回条件:

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

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

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

 

你可能感兴趣的:(理解)