首页 > 学院 > 操作系统 > 正文

信号之sleep函数

2024-06-28 13:28:25
字体:
来源:转载
供稿:网友
信号之sleep函数
#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/


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表