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