信号屏蔽的切换的理解sigsuspend

时间:2023-03-08 18:27:27
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handle(int s)
{
printf("外部用户中断处理...!\n");
sleep();
printf("外部用户中断处理结束!\n");
} main()
{
int sum=;
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,);
for(i=;i<;i++)
{
printf("正在拷贝电影<%d>!\n",i);
sleep();//模拟业务处理时间比较长
printf("电影拷贝完毕<%d>!\n",i);
sigpending(&sigu);
if(sigismember(&sigu,SIGINT))
{
sigsuspend(&sigt);
} }
printf("所有电影拷贝完毕\n",sum);
printf("over!\n");
sigprocmask(SIG_UNBLOCK,&sigs,);
}

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

sigsuspend返回条件:

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

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

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