进程间通信之:信号
表8.15列举了sigprocmask的语法要点。
表8.15 sigprocmask函数语法要点
所需头文件 | #includesignal.h> | |
函数原型 | intsigprocmask(inthow,constsigset_t*set,sigset_t*oset) | |
函数传入值 | how:决定函数的操作方式 | SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中 |
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合 | ||
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合 | ||
set:指定信号集 | ||
oset:信号屏蔽字 | ||
函数返回值 | 成功:0 | |
出错:-1 |
此处,若set是一个非空指针,则参数how表示函数的操作方式;若how为空,则表示忽略此操作。
最后,表8.16列举了sigpending函数的语法要点。
表8.16 sigpending函数语法要点
所需头文件 | #includesignal.h> | |
函数原型 | intsigpending(sigset_t*set) | |
函数传入值 | set:要检测的信号集 | |
函数返回值 | 成功:0 | |
出错:-1 |
总之,在处理信号时,一般遵循如图8.7所示的操作流程。
图8.7一般的信号操作处理流程
(3)使用实例。
该实例首先把SIGQUIT、SIGINT两个信号加入信号集,然后将该信号集合设为阻塞状态,并进入用户输入状态。用户只需按任意键,就可以立刻将信号集合设置为非阻塞状态,再对这两个信号分别操作,其中SIGQUIT执行默认操作,而SIGINT执行用户自定义函数的操作。源代码如下所示:
/*sigset.c*/
#includesys/types.h>
#includeunistd.h>
#includesignal.h>
#includestdio.h>
#includestdlib.h>
/*自定义的信号处理函数*/
voidmy_func(intsignum)
{
printf(Ifyouwanttoquit,pleasetrySIGQUITn);
}
intmain()
{
sigset_tset,pendset;
structsigactionaction1,action2;
/*初始化信号集为空*/
if(sigemptyset(set)0)
{
perror(sigemptyset);
exit(1);
}
/*将相应的信号加入信号集*/
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);
}
/*设置信号集屏蔽字,此时set中的信号不会被传递给进程,暂时进入待处理状态*/
if(sigprocmask(SIG_BLOCK,set,NULL)0)
{
perror(sigprocmask);
exit(1);
}
else
{
printf(Signalsetwasblocked,Pressanykey!);
getchar();
}
linux操作系统文章专题:linux操作系统详解(linux不再难懂)模拟信号相关文章:什么是模拟信号
linux相关文章:linux教程
数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论