可以用setjmp和longjmp来避免一些竞争条件
- /*
- * 10-8.c
- *
- * Created on: May 9, 2012
- * Author: yyp
- */
- #include <stdio.h>
- #include <signal.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <setjmp.h>
- #define MAXLINE 1024
- static void sig_alrm(int signo);
- static jmp_buf env_alrm;
- int main(int argc, char *argv[]){
-
- char line[MAXLINE];
- int nread;
- if(signal(SIGALRM, sig_alrm) == SIG_ERR){
- perror("sig_err");
- exit(EXIT_FAILURE);
- }
- if(setjmp(env_alrm) != 0){
- perror("sig_err");
- exit(EXIT_FAILURE);/*如果超时,则退出*/
- }
-
- alarm(10);
- if((nread = read(STDIN_FILENO, line, MAXLINE)) < 0){
- perror("read");
- }
- alarm(0);
-
- write(STDOUT_FILENO, line, nread);
-
- return 0;
- }
- static void sig_alrm(int signo){
- longjmp(env_alrm, 1);
- }
避免了第一次alarm之后read之前,内核使进程阻塞,而时间长度又超过闹钟时间,则read可能永远阻塞。加入setjmp和longjmp之后,如果超时,则退出。
阅读(627) | 评论(0) | 转发(0) |