使用longjmp,带超时限制调用read
//Set max timeout when block reading// by Jay Zhang#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>#include <setjmp.h>static void sig_alarm(int);static jmp_buf env_alarm;#define MAXLINE1024int main(void){int n;char line[MAXLINE];if(signal(SIGALRM, sig_alarm) == SIG_ERR) {printf("signal SIGALARM error\n");return -1;}if(setjmp(env_alarm) != 0) {printf("read timeout\n");return 0;}alarm(10);if((n = read(STDIN_FILENO, line, MAXLINE)) < 0) {printf("read error\n");}alarm(0);write(STDOUT_FILENO, line, n);return 0;}static voidsig_alarm(int signo){longjmp(env_alarm, 1);}