Linux_20170712_mysleep

来源:互联网 发布:星际边界mac 编辑:程序博客网 时间:2024/06/07 19:44

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

原创粉丝点击