进程间通信之:信号
(3)使用实例。
第一个实例表明了如何使用signal()函数捕捉相应信号,并做出给定的处理。这里,my_func就是信号处理的函数指针。读者还可以将其改为SIG_IGN或SIG_DFL查看运行结果。第二个实例是用sigaction()函数实现同样的功能。
以下是使用signal()函数的示例:
/*signal.c*/
#includesignal.h>
#includestdio.h>
#includestdlib.h>
/*自定义信号处理函数*/
voidmy_func(intsign_no)
{
if(sign_no==SIGINT)
{
printf(IhavegetSIGINTn);
}
elseif(sign_no==SIGQUIT)
{
printf(IhavegetSIGQUITn);
}
}
intmain()
{
printf(WaitingforsignalSIGINTorSIGQUIT...n);
/*发出相应的信号,并跳转到信号处理函数处*/
signal(SIGINT,my_func);
signal(SIGQUIT,my_func);
pause();
exit(0);
}
运行结果如下所示。
$./signal
WaitingforsignalSIGINTorSIGQUIT...
IhavegetSIGINT(按ctrl-c组合键)
$./signal
WaitingforsignalSIGINTorSIGQUIT...
IhavegetSIGQUIT(按ctrl-组合键)
以下是用sigaction()函数实现同样的功能,下面只列出更新的main()函数部分。
/*sigaction.c*/
/*前部分省略*/
intmain()
{
structsigactionaction;
printf(WaitingforsignalSIGINTorSIGQUIT...n);
/*sigaction结构初始化*/
action.sa_handler=my_func;
sigemptyset(action.sa_mask);
action.sa_flags=0;
/*发出相应的信号,并跳转到信号处理函数处*/
sigaction(SIGINT,action,0);
sigaction(SIGQUIT,action,0);
pause();
exit(0);
}
2.信号集函数组
(1)函数说明。
使用信号集函数组处理信号时涉及一系列的函数,这些函数按照调用的先后次序可分为以下几大功能模块:创建信号集合、注册信号处理函数以及检测信号。
其中,创建信号集合主要用于处理用户感兴趣的一些信号,其函数包括以下几个。
n sigemptyset():将信号集合初始化为空。
n sigfillset():将信号集合初始化为包含所有已定义的信号的集合。
n sigaddset():将指定信号加入到信号集合中去。
n sigdelset():将指定信号从信号集合中删除。
n sigismember():查询指定信号是否在信号集合之中。
注册信号处理函数主要用于决定进程如何处理信号。这里要注意的是,信号集里的信号并不是真正可以处理的信号,只有当信号的状态处于非阻塞状态时才会真正起作用。因此,首先使用sigprocmask()函数检测并更改信号屏蔽字(信号屏蔽字是用来指定当前被阻塞的一组信号,它们不会被进程接收),然后使用sigaction()函数来定义进程接收到特定信号之后的行为。检测信号是信号处理的后续步骤,因为被阻塞的信号不会传递给进程,所以这些信号就处于“未处理”状态(也就是进程不清楚它的存在)。sigpending()函数允许进程检测“未处理”信号,并进一步决定对它们作何处理。
(2)函数格式。
首先介绍创建信号集合的函数格式,表8.14列举了这一组函数的语法要点。
表8.14 创建信号集合函数语法要点
所需头文件 | #includesignal.h> |
函数原型 | intsigemptyset(sigset_t*set) |
intsigfillset(sigset_t*set) | |
intsigaddset(sigset_t*set,intsignum) | |
intsigdelset(sigset_t*set,intsignum) | |
intsigismember(sigset_t*set,intsignum) | |
函数传入值 | set:信号集 |
signum:指定信号代码 | |
函数返回值 | 成功:0(sigismember成功返回1,失败返回0) |
出错:-1 |
![](https://webstorage.eepw.com.cn/images/2014/m/wx.png)
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码