sleep使进程一直挂起,直到满足一下两个条件之一:
1、睡眠时间到时;
2、调用进程捕捉到一个信号,并从该信号处理函数返回;
#include "apue.h"
#include <signal.h>
static void
sig_alrm(int signo){}
unsigned int
sleep(unsigned int nsecs)
{
struct sigaction newact, oldact;
sigset_t newmask, oldmask, suspmask;
unsigned int unslpt;
newact.sa_handler = sig_alrm;
sigemptyset(&newact.sa_mask);
newact.sa_flags = 0;
sigaction(SIGALRM, &act, &oldact); //设置SIGARLRM的处理函数,默认是结束自身进程
sigemptyset(&newmask);
sigaddset(&newmask, SIGALRM);
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) //阻塞SIG_BLOCK
err_sys("sigprocmask(SIG_BLOCK)");
alarm(nsecs);
suspmask = oldmask;
sigdelset(&suspmask, SIGALRM);
sigsuspend(&suspmask); //挂起,直到收到一个信号。(屏蔽suspmask里的信号)
unslept = alrm(0);
sigaction(SIGALRM, &oldact, NULL); //还原SIGARLRM的默认处理方式
sigprocmask(SIG_SETMASK, &oldmask, NULL); //还原进程的掩码
return unslept;
}