信号之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/


分享给朋友:
您可能感兴趣的文章:
随机阅读: