#include <unistd.h>unsigned int sleep(unsigned int seconds);返回值:0或未休眠夠的秒數
此函數使調用進程被掛起,直到滿足以下條件之一:
(1)已經過了seconds所指定的墻上時鐘時間。
(2)調用進程捕捉到一個信號并從信號處理程序返回。
如果alarm信號一樣,由于其他系統活動,實際返回時間比所要求的會遲一些。
在第(1)種情形中,返回值是0。當由于捕捉到某個信號,sleep提早返回時(第(2)種情形),返回值是未睡夠的秒數(所要求的時間減去實際休眠的時間)。
盡管sleep可以用alarm函數(http://www.CUOXin.com/nufangrensheng/p/3515013.html)實現,但這并不是必需的。如果使用alarm,則這兩個函數之間可能會交互作用。
程序清單10-21 sleep的可靠實現
#include "apue.h"static voidsig_alrm(int signo){ /* nothing to do, just returning wakes up sigsuspend() */}unsigned intsleep(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/。
新聞熱點
疑難解答