新闻中心

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

进程间通信之:信号

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

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

表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教程


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


通信相关文章:通信原理




评论


相关推荐

技术专区

关闭