新闻中心

EEPW首页>嵌入式系统>设计应用> 进程间通信之:信号

进程间通信之:信号

作者: 时间:2013-09-13 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/257126.htm

(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

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

模拟信号相关文章:什么是模拟信号


linux相关文章:linux教程


数字通信相关文章:数字通信原理


通信相关文章:通信原理




评论


相关推荐

技术专区

关闭