信号休眠函数

83 阅读2分钟

信号休眠函数非常适用于下面的场景(有时候,不使用 waitpid 是因为,信号是专注于一个特定事件的,而子进程有的时候,会完成不少不相关事件) 输入图片说明

(线程最大的好处,就是可以让我们分头处理一些事情,再汇合,由此提升了效率)

在这里,我们有必要再次回顾 忙等待 的概念,它可以告诉我们为什么我们需要信号休眠函数

忙等待 的 回顾

忙等待,实际上就是一刻不断的查询某个特定事件是否发生。

输入图片说明

而它的不足也非常明显,如果一个事情一直没有完成,那么它就会一直查询下去,后果就是占用大量系统资源。

/*
    可以将 waitpid 的控制参数设定为 WNOHANG
    (如果指定的进程没有结束,就立刻返回)
    结合 一个循环,实现忙等待
*/
while (0 == waitpid (pid, 0, WNOHANG))
    ;

休眠函数

现在我们将目光转回信号,我们可以注意到,信号与一般子进程的最大不同在于,我们的信号,是 “突如其来" 的,所以需要另一种方式,来加以解决。

Unix 提供了两种方式。

pause 函数

pause 会一直阻塞我们当前程序的运行,直接将我们的进程转入阻塞态,直到有新的信号到来。

定时休眠函数

值得注意的事情是,pause 函数可能会让我们的程序一直阻塞,事实上失去运行能力。

所以就有了定时休眠函数,它们可以让程序只休眠一段时间(中途有信号到达,则立刻中止休眠状态)

它们是 sleep,usleep,区别在于精度不同。