Linux_20170712_mysleep

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值