Chinaunix首页 | 论坛 | 博客
  • 博客访问: 481467
  • 博文数量: 120
  • 博客积分: 1853
  • 博客等级: 上尉
  • 技术积分: 1177
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-22 22:40
文章分类

全部博文(120)

文章存档

2013年(16)

2012年(104)

分类: LINUX

2012-05-09 16:18:52

可以用setjmp和longjmp来避免一些竞争条件


点击(此处)折叠或打开

  1. /*
  2.  * 10-8.c
  3.  *
  4.  * Created on: May 9, 2012
  5.  * Author: yyp
  6.  */
  7. #include <stdio.h>
  8. #include <signal.h>
  9. #include <unistd.h>
  10. #include <stdlib.h>
  11. #include <setjmp.h>
  12. #define MAXLINE 1024

  13. static void sig_alrm(int signo);
  14. static jmp_buf env_alrm;

  15. int main(int argc, char *argv[]){
  16.     
  17.      char line[MAXLINE];
  18.      int nread;

  19.     if(signal(SIGALRM, sig_alrm) == SIG_ERR){
  20.         perror("sig_err");
  21.         exit(EXIT_FAILURE);
  22.     }
  23.     if(setjmp(env_alrm) != 0){
  24.         perror("sig_err");
  25.         exit(EXIT_FAILURE);/*如果超时,则退出*/
  26.     }
  27.     
  28.     alarm(10);
  29.     if((nread = read(STDIN_FILENO, line, MAXLINE)) < 0){
  30.         perror("read");
  31.     }
  32.     alarm(0);
  33.     
  34.     write(STDOUT_FILENO, line, nread);
  35.     
  36.     return 0;
  37. }

  38. static void sig_alrm(int signo){
  39.     longjmp(env_alrm, 1);
  40. }
避免了第一次alarm之后read之前,内核使进程阻塞,而时间长度又超过闹钟时间,则read可能永远阻塞。加入setjmp和longjmp之后,如果超时,则退出。


阅读(623) | 评论(0) | 转发(0) |
0

上一篇:setjmp函数

下一篇:原来struct里也能有函数

给主人留下些什么吧!~~