sleep函数-hds ams 2500用户手册
10.19 sleep函数在本书的很多例子中都已使用了sleep函数,在程序10-4和10-5中有两个sleep的很完善的实现。
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
unistd.h>
返回:0或未睡的秒数此函数使调用进程被挂起直到:
(1)已经过了seconds所指定的墙上时钟时间,或者(2)该进程捕捉到一个信号并从信号处理程序返回。如同alarm信号一样,由于某些系统活动,实际返回时间比所要求的会迟一些。
在第(1)种情形,返回值是0。当由于捕捉到某个信号sleep提早返回时(第(2)种情形),返回值是未睡足的秒数(所要求的时间减实际睡眠时间)。sleep可以用alarm函数(见10.10节)实现,但这并不是必需的。如果使用alarm,则这两个函数之间可以有交互作用。POSIX.1标准对这些交互作用并未作任何说明。若先调用alarm(10),过了3秒后又调用sleep(5),那么将如何呢? sleep将在5秒后返回(假定在这段时间内没有捕捉到另一个信号),但是否在2秒后又产生另一个SIGALRM信号呢? 这种细节依赖于实现。
SVR4用alarm实现sleep。sleep(3)手册页中说明以前安排的闹钟仍被正常处理。在前面的例子中,在sleep返回之前,它安排在2秒后再次到达闹钟时间。在这种情况下,sleep返回0。(很明显,sleep必须保存SIGALRM信号处理程序的地址,在返回前重新设置它。)
如果先做一次alarm(6),3秒钟之后又做一次sleep(5),则在3秒后sleep返回,而不是5秒钟。此时,sleep的返回值则是未睡足的时间2秒。4.3+BSD则使用另一种技术:由setimer(2)提供间隔计时器。该计时器独立于alarm函数,但在以前设置的间隔计时器和sleep之间仍能有相互作用。
尽管闹钟计时器(alarm)和间隔计时器(setimer)是分开的,但是不幸它们使用同一SIGALRM信号。因为sleep暂时将该信号的处理程序改变为它自己的函数,所以在alarm和sleep之间仍可能有不希望的相互作用。如果混合调用sleep和其他与时间有关的函数,它们之间有相互作用,则你应当清楚地了解你所使用的系统是如何实现sleep的。以前伯克利类的sleep实现不提供任何有用的返回信息。这在4.3+BSD中已经解决。
实例程序10-21是一个POSIX.1 sleep函数的实现。此函数是程序10-4的修改版,它可靠地处理信号,避免了早期实现中的竞态条件,但是仍未处理与以前设置的闹钟的相互作用(正如前面提到的,POSIX.1并未对这些交互作用进行定义)。
对于更多关于POSIX标准以及函数接口查询的内容,可以参考这里。如果你对Linux系统中模拟实现sleep函数的过程感兴趣,请看这个链接。