UNIX环境高级编程(八)信号

同步

异步
异步事件的处理:查询法、通知法

一、信号
1信号的概念
信号是软件中断。
信号的响应依赖于中断
signal()
信号会打断阻塞的系统调用。

信号的不可靠
信号的不可靠是指信号的行为不可靠。
信号的响应过程
信号从输入到响硬有一个不可避免的延时
标准信号为什么要丢失
标准信号的响应没有严格的顺序

kill(2)

 kill - send a signal to a process or a group of processes
 
 #include <signal.h>
 
 int kill(pid_t pid, int sig);

kill(2) 函数的作用是将指定的信号(sig)发送给指定的进程(pid)。

大家一看到 kill 就觉得有杀死进程的意味,其实未必如此,kill(3) 也负责给进程发送各种信号。

参数列表:

pid:接收信号的进程 ID。可填的内容详见下表:

说明
>0接收信号的进程 ID。
==0发送信号给当前进程所在进程组的所有进程。
==-1发送信号给当前进程有权向它们发送信号的所有进程,1 号 init 进程除外。相当于一个全局广播信号,发送这种信号一般只有 1 号 init 会做,比如在关机的时候 init 进程会发送全局广播信号通知大家该结束了。
<-1将 pid 的绝对值作为组 ID,给这个组中所有的进程发送信号。

sig:要发送的信号,可以使用 kill(1) -l 所列出的信号。如果 sig 是 0 会执行所有的错误检查,但并不真正发送信号。所以通常使用 0 值检查一个进程是否仍然存在,如果该进程不存在则返回 -1 并将 errno 设置为 ESRCH。需要注意的是这种检查并不原子,当 kill(2) 返回测试结果的时候也许被测试的进程已经终止了。当然也可以测试当前进程是否对目标进程有权限发送信号,如果 errno 为 EPERM 表示被测试的进程存在但当前进程无权限访问。

返回值:成功为 0,失败为 -1,并设置 errno。

pause(3P)

 pause - suspend the thread until a signal is received
 
 #include <unistd.h>
 
 int pause(void);

专门用于阻塞当前进程,等待一个信号来打断它。

alarm(3P)

 alarm - schedule an alarm signal
 
 #include <unistd.h>
 
 unsigned alarm(unsigned seconds);

指定 seconds 秒,发送一个 SIGALRM 信号给自己。

seconds 为 0 的时候,表示取消这个定时器,并且新设置的值会覆盖上次设置的值。所以当程序中出现了多个对 alarm(3P) 的调用时,计时是不准确的。

注意,SIGALRM 信号默认动作是杀死进程。


版权声明:本文为qq_43420088原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。