进程间通信之:信号
2.alarm()和pause()
(1)函数说明。
alarm()也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它就向进程发送SIGALARM信号。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm()之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。
pause()函数是用于将调用进程挂起直至捕捉到信号为止。这个函数很常用,通常可以用于判断信号是否已到。
(2)函数格式。
表8.9列出了alarm()函数的语法要点。
表8.9 alarm()函数语法要点
所需头文件 | #includeunistd.h> |
函数原型 | unsignedintalarm(unsignedintseconds) |
函数传入值 | seconds:指定秒数,系统经过seconds秒之后向该进程发送SIGALRM信号 |
函数返回值 | 成功:如果调用此alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0 |
出错:-1 |
表8.10列出了pause()函数的语法要点。
表8.10 pause()函数语法要点
所需头文件 | #includeunistd.h> |
函数原型 | intpause(void) |
函数返回值 | -1,并且把error值设为EINTR |
(3)函数实例。
该实例实际上已完成了一个简单的sleep()函数的功能,由于SIGALARM默认的系统动作为终止该进程,因此程序在打印信息之前,就会被结束了。代码如下所示:
/*alarm_pause.c*/
#includeunistd.h>
#includestdio.h>
#includestdlib.h>
intmain()
{
/*调用alarm定时器函数*/
intret=alarm(5);
pause();
printf(Ihavebeenwakenup.n,ret);/*此语句不会被执行*/
}
$./alarm_pause
Alarmclock
想一想 | 用这种形式实现的sleep()功能有什么问题? |
8.3.3信号的处理
在了解了信号的产生与捕获之后,接下来就要对信号进行具体的操作了。从前面的信号概述中读者也可以看到,特定的信号是与一定的进程相联系的。也就是说,一个进程可以决定在该进程中需要对哪些信号进行什么样的处理。例如,一个进程可以选择忽略某些信号而只处理其他一些信号,另外,一个进程还可以选择如何处理信号。总之,这些都是与特定的进程相联系的。因此,首先就要建立进程与其信号之间的对应关系,这就是信号的处理。
注意 | 请读者注意信号的注册与信号的处理之间的区别,前者信号是主动方,而后者进程是主动方。信号的注册是在进程选择了特定信号处理之后特定信号的主动行为。 |
信号处理的主要方法有两种,一种是使用简单的signal()函数,另一种是使用信号集函数组。下面分别介绍这两种处理方式。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)模拟信号相关文章:什么是模拟信号
linux相关文章:linux教程
数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论