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

  • 相关阅读:
    使用Mysql慢查询日志对有效率问题的SQL进行监控
    wampserver3.1.0安装及配置
    Composer
    HTML5 本地存储(Web Storage)
    HTML5 元素拖动
    生成验证码
    git 基础命令
    POI使用流程
    JDK各版本新特性总结
    dubbo+zookeeper项目搭建
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3517365.html
Copyright © 2020-2023  润新知