信号之sleep函数
#include <unistd.h> unsigned int sleep(unsigned int seconds); 返回值:0或未休眠够的秒数
此函数使调用进程被挂起,直到满足以下条件之一:
(1)已经过了seconds所指定的墙上时钟时间。
(2)调用进程捕捉到一个信号并从信号处理程序返回。
如果alarm信号一样,由于其他系统活动,实际返回时间比所要求的会迟一些。
在第(1)种情形中,返回值是0。当由于捕捉到某个信号,sleep提早返回时(第(2)种情形),返回值是未睡够的秒数(所要求的时间减去实际休眠的时间)。
尽管sleep可以用alarm函数(http://www.cnblogs.com/nufangrensheng/p/3515013.html)实现,但这并不是必需的。如果使用alarm,则这两个函数之间可能会交互作用。
程序清单10-21 sleep的可靠实现
#include "apue.h" static void sig_alrm(int signo) { /* nothing to do, just returning wakes up sigsuspend() */ } unsigned int sleep(unsigned int nsecs) { struct sigaction newact, oldact; sigset_t newmask, oldmask, suspmask; unsigned int unslept; /* set our handler, save previous information */ newact.sa_handler = sig_alrm; sigemptyset(&newact.sa_mask); newact.sa_flags = 0; sigaction(SIGALRM, &newact, &oldact); /* block SIGALRM and save current signal mask */ sigemptyset(&newmask); sigaddset(&newmask, SIGALRM); sigprocmask(SIG_BLOCK, &newmask, &oldmask); alarm(nsecs); suspmask = oldmask; sigdelset(&suspmask, SIGALRM); /* make sure SIGALRM isn't blocked */ sigsuspend(&suspmask); /* wait for any signal to be caught */ /* some signal has been caught, SIGALRM is now blocked */ unslept = alarm(0); sigaction(SIGALRM, &oldact, NULL); /* reset previous action */ /* reset signal mask, which unblocks SIGALRM */ sigprocmask(SIG_SETMASK, &oldmask, NULL); return(unslept); }
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。