歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 信號量sigprocmask使用

Linux 信號量sigprocmask使用

日期:2017/2/28 15:56:24   编辑:Linux教程

源程序:

#include <signal.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
double y;
sigset_t intmask;
int i,repeat_factor;
if(argc!=2)
{
fprintf(stderr,"Usage:%s repeat_factor\n\a",argv[0]);
exit(1);
}
if((repeat_factor=atoi(argv[1]))<1)repeat_factor=10;
sigemptyset(&intmask); /* 將信號集合設置為空 */
sigaddset(&intmask,SIGINT); /* 加入中斷 Ctrl+C 信號*/
while(1)
{
/*阻塞信號,我們不希望保存原來的集合所以參數為NULL*/
sigprocmask(SIG_BLOCK,&intmask,NULL);
fprintf(stderr,"SIGINT signal blocked\n");
for(i=0;i<repeat_factor;i++)y=sin((double)i);
fprintf(stderr,"Blocked calculation is finished\n");
/* 取消阻塞 */
sigprocmask(SIG_UNBLOCK,&intmask,NULL);
fprintf(stderr,"SIGINT signal unblocked\n");
for(i=0;i<repeat_factor;i++)y=sin((double)i);
fprintf(stderr,"Unblocked calculation is finished\n");
}
exit(0);
}

解釋如下:

sigemptyset 函數初始化信號集合set,將set 設置為空.

sigfillset 也初始化信號集合,只是將信號集合設置為所有信號的集合.

sigaddset 將信號signo 加入到信號集合之中,sigdelset 將信號從信號集合中刪除.

sigismember 查詢信號是否在信號集合之中.s

igprocmask 是最為關鍵的一個函數.在使用之前要先設置好信號集合set.這個函數的作用是將指定的信號集合set 加入到進程的信號阻塞集合之中去,如果提供了oset 那麼當前的進程信號阻塞集合將會保存在oset 裡面.參數how 決定函數的操作方式:
SIG_BLOCK:增加一個信號集合到當前進程的阻塞集合之中.
SIG_UNBLOCK:從當前的阻塞集合之中刪除一個信號集合.
SIG_SETMASK:將當前的信號集合設置為信號阻塞集合.

上述源程序,在不帶參數執行時,輸出是個錯誤的結果是:Usage:./sigset repeat_factor

帶參數執行後的結果將是不斷重復如下語言:

SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished

在輸入Ctrl+c後將會停止。

Copyright © Linux教程網 All Rights Reserved