進程間通信之:信號
表8.15列舉了sigprocmask的語法要點。
表8.15 sigprocmask函數(shù)語法要點
所需頭文件 | #includesignal.h> | |
函數(shù)原型 | intsigprocmask(inthow,constsigset_t*set,sigset_t*oset) | |
函數(shù)傳入值 | how:決定函數(shù)的操作方式 | SIG_BLOCK:增加一個信號集合到當(dāng)前進程的阻塞集合之中 |
SIG_UNBLOCK:從當(dāng)前的阻塞集合之中刪除一個信號集合 | ||
SIG_SETMASK:將當(dāng)前的信號集合設(shè)置為信號阻塞集合 | ||
set:指定信號集 | ||
oset:信號屏蔽字 | ||
函數(shù)返回值 | 成功:0 | |
出錯:-1 |
此處,若set是一個非空指針,則參數(shù)how表示函數(shù)的操作方式;若how為空,則表示忽略此操作。
最后,表8.16列舉了sigpending函數(shù)的語法要點。
表8.16 sigpending函數(shù)語法要點
所需頭文件 | #includesignal.h> | |
函數(shù)原型 | intsigpending(sigset_t*set) | |
函數(shù)傳入值 | set:要檢測的信號集 | |
函數(shù)返回值 | 成功:0 | |
出錯:-1 |
總之,在處理信號時,一般遵循如圖8.7所示的操作流程。
圖8.7一般的信號操作處理流程
(3)使用實例。
該實例首先把SIGQUIT、SIGINT兩個信號加入信號集,然后將該信號集合設(shè)為阻塞狀態(tài),并進入用戶輸入狀態(tài)。用戶只需按任意鍵,就可以立刻將信號集合設(shè)置為非阻塞狀態(tài),再對這兩個信號分別操作,其中SIGQUIT執(zhí)行默認(rèn)操作,而SIGINT執(zhí)行用戶自定義函數(shù)的操作。源代碼如下所示:
/*sigset.c*/
#includesys/types.h>
#includeunistd.h>
#includesignal.h>
#includestdio.h>
#includestdlib.h>
/*自定義的信號處理函數(shù)*/
voidmy_func(intsignum)
{
printf(Ifyouwanttoquit,pleasetrySIGQUITn);
}
intmain()
{
sigset_tset,pendset;
structsigactionaction1,action2;
/*初始化信號集為空*/
if(sigemptyset(set)0)
{
perror(sigemptyset);
exit(1);
}
/*將相應(yīng)的信號加入信號集*/
if(sigaddset(set,SIGQUIT)0)
{
perror(sigaddset);
exit(1);
}
if(sigaddset(set,SIGINT)0)
{
perror(sigaddset);
exit(1);
}
if(sigismember(set,SIGINT))
{
sigemptyset(action1.sa_mask);
action1.sa_handler=my_func;
action1.sa_flags=0;
sigaction(SIGINT,action1,NULL);
}
if(sigismember(set,SIGQUIT))
{
sigemptyset(action2.sa_mask);
action2.sa_handler=SIG_DFL;
action2.sa_flags=0;
sigaction(SIGQUIT,action2,NULL);
}
/*設(shè)置信號集屏蔽字,此時set中的信號不會被傳遞給進程,暫時進入待處理狀態(tài)*/
if(sigprocmask(SIG_BLOCK,set,NULL)0)
{
perror(sigprocmask);
exit(1);
}
else
{
printf(Signalsetwasblocked,Pressanykey!);
getchar();
}
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)模擬信號相關(guān)文章:什么是模擬信號
linux相關(guān)文章:linux教程
數(shù)字通信相關(guān)文章:數(shù)字通信原理
通信相關(guān)文章:通信原理
評論