1. 编写普通版本mysleep
运行结果
2. 编写规避竞态条件的mysleep
这里我们使用sigsusupend来替代pause防止出现被无限挂起的情况
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
void handler(int signum)
{}
unsigned int mysleep (unsigned int timeout)
{
struct sigaction act,oact;
sigset_t mask,omask,suspmask;
unsigned ret;
act.sa_handler=handler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
sigaction(SIGALRM,&act,&oact);
sigemptyset(&mask);
sigaddset(&mask,SIGALRM);
sigprocmask(SIG_BLOCK,&mask,&omask);
alarm(timeout);//20
suspmask = omask;
sigdelset(&suspmask,SIGALRM);
sigsuspend(&suspmask);
ret=alarm(0);//24
运行结果
3. 对两者进行对比
相比普通版本的mysleep,系统运行的时序(Timing) sigsuspend包含了pause的挂起等待功能,同时解决了竞态条件的问题,在对时序要求严格的场合下都应该调⽤用sigsuspend而不是pause。
#include