信號屏蔽的切換的理解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()+指定屏蔽的信號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM