Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1756976
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: C/C++

2012-02-17 20:48:30

  1. #include "apue.h"
  2. static void
  3. sig_alrm(int signo)
  4. {
  5.     /* nothing to do ,just returning wakes up to sigsuspend() */
  6. }
  7. unsigned int
  8. sleep(unsigned int nsecs)
  9. {
  10.     struct sigaction newact,oldact;
  11.     sigset_t newmask,oldmask,susmask;
  12.     unsigned int unslept;

  13.     /*
  14.      * set our handler,save previous information
  15.      */
  16.     newact.sa_handler = sig_alrm;
  17.     sigemptyset(&newact.sa_mask);
  18.     newact.sa_flags = 0;
  19.     sigaction(SIGALRM,&newact,&oldact);

  20.     /*
  21.      * block sigalrm and save current signal mask
  22.      */
  23.     sigemptyset(&newmask);
  24.     sigaddset(&newmask,SIGALRM);
  25.         sigprocmask(SIG_BLOCK,&newmask,&oldmask);

  26.     alarm(nsecs);
  27.     susmask = oldmask; /* make sure SIGALRM not block */
  28.     sigdelset(&susmask,SIGALRM);
  29.     sigsuspend(&susmask); /* wait for any signal ro be caught */

  30.     /*
  31.      * some signal has been caught,sigalrm is now block
  32.      */
  33.     unslept = alarm(0);
  34.     sigaction(SIGALRM,&oldact,NULL); /* reset previous action */
  35.     /*
  36.      * reset signal mask,which unblock sigalrm
  37.      */
  38.     return(unslept);
  39. }
阅读(1263) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~