#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返回条件:
- 信号发生,并且信号是非屏蔽信号
- 信号必须要处理,而且处理函数返回后sigsuspend才返回。
sigsuspend设置新的屏蔽信号,保存旧的屏蔽信号,而且当sigsuspend返回的时候,恢复旧的屏蔽信号。
其实可以这样理解:sigsuspend=pause()+指定屏蔽的信号