mysleep 的两种实现

一、

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
void myhandler(int sig) //句柄函数什么也不做
{} 
int mysleep(int timeout) 
{ 
      struct sigaction act,oact; 
      act.sa_handler = myhandler; 
      sigemptyset(&act.sa_mask);//信号集的初始化 
      act.sa_flags = 0; 
      sigaction(SIGALRM,&act,&oact);//注册信号处理函数

      alarm(timeout);//设置闹钟 
     pause();//将自己挂起直到有信号递达 
      int ret = alarm(0);//取消闹钟 
      sigaction(SIGALRM,&oact,NULL);//恢复对SIGALRM信号的处理动作 
      return ret; 
}   
int main() 
{ 
     while(1) 
     { 
         mysleep(2); 
         printf("use mysleep!\n"); 
     } 

     return 0; 
}        

二、避免竞态条件的mysleep

#include<stdio.h> 
#include<signal.h> 
void myhandler(int sig) 
{ 
     //printf("get a sig:%d\n",sig); 
} 
     struct sigaction act,oact; 
     sigset_t newmask,oldmask,suspmask;//设置信号集 
      act.sa_handler = myhandler; 
      sigemptyset(&act.sa_mask);//信号集的初始化 
      act.sa_flags = 0; 
      sigaction(SIGALRM,&act,&oact);//读取和修改与SIGALRM信号相关联的处理动作   
      sigemptyset(&newmask);//初始化信号集 
      sigaddset(&newmask,SIGALRM);//为信号集添加SIGALRM信号        
      alarm(timeout);//设置闹钟 
      sigdelset(&oldmask,SIGALRM);//从信号集oldmask中删除SIGALRM信号 
      sigsuspend(&oldmask);//将当前进程的信号屏蔽字设为oldmask,在进程接受到信号之前,进程会挂起,当捕捉一个信号,首先执行信号处理程序,然后从sigsuspend返回,最后将信号屏蔽字恢复为调用sigsuspend之前的值
      //pause();//将自己挂起直到有信号递达 

      int ret = alarm(0);//取消闹钟 
      sigaction(SIGALRM,&oact,NULL);//恢复对SIGALRM信号的处理动作 
      return ret; 
} 

 int main() 
 { 
    while(1) 
    { 
         mysleep(2); 
         printf("use mysleep!\n"); 
    } 

return 0; 
}

三、对比两种方法:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值