使用这种方法无需担心,一个慢速的系统调用是否被中断。
一、源代码:
1 #include "apue.h"
2 #include <setjmp.h>
3
4 static void sig_alarm(int sig_no);
5 static jmp_buf env_alrm;
6 int main()
7 {
8 int n;
9 char line[MAXLINE];
10
11 if (setjmp(env_alrm) != 0)
12 err_quit("read timeout");
13 if (signal(SIGALRM,sig_alarm) == SIG_ERR){
14 err_sys("signal SIGALRM handler creation error");
15 }
16
17 alarm(10);
18
19 if ((n=read(STDIN_FILENO,line,MAXLINE)) < 0)
20 err_sys("read error");
21
22 alarm(0);
23
24 write(STDOUT_FILENO,line,n);
25 exit(0);
26 }
27
28
29
30 static void sig_alarm (int sig_no)
31 {
32 longjmp(env_alrm,1);
33 }
2.运行结果:
./avoid_restart
read timeout