#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返回條件:
- 信號發生,並且信號是非屏蔽信號
- 信號必須要處理,而且處理函數返回后sigsuspend才返回。
sigsuspend設置新的屏蔽信號,保存舊的屏蔽信號,而且當sigsuspend返回的時候,恢復舊的屏蔽信號。
其實可以這樣理解:sigsuspend=pause()+指定屏蔽的信號