sleep.c

来自「这是一个介绍 linux 编程知识的文章。」· C语言 代码 · 共 44 行

C
44
字号
#include <sys/types.h>
#include <stddef.h>
#include <signal.h>
#include <unistd.h>

static void sig_alrm (int signo)
{
    return; /* 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;

    newact.sa_handler = sig_alrm;
    sigemptyset (&newact.sa_mask);
    newact.sa_flags = 0;
    sigaction (SIGALRM, &newact, &oldact);
                             /* set our handler, save previous information */
    sigemptyset (&newmask);
    sigaddset (&newmask, SIGALRM);
                             /* block SIGALRM and save current signal mask */
    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 */

    sigprocmask (SIG_SETMASK, &oldmask, NULL);

    return (unslept);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?