使用alarm和setjmp实现超时控制
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <signal.h>#include <setjmp.h>#define JMP_VALUE 12345static jmp_buf test_jmp_env;static void test_alarm(int n){printf("alarm signal:%d\r\n", n); longjmp(test_jmp_env, JMP_VALUE);}void DoSomething(){int i = 0;while(1){printf("%d\r\n", i++);sleep(1);}}void DoSomethingWithTimeout(int nTimeout){__sighandler_t old_handler = signal(SIGALRM, test_alarm);alarm(nTimeout);int n = setjmp(test_jmp_env);printf("setjmp result:%d\r\n", n);if(JMP_VALUE == n){signal(SIGALRM, old_handler);return;}else if(0 == n){DoSomething();alarm(0);signal(SIGALRM, old_handler);}else{printf("error\r\n");exit(-1);}}int main(void){DoSomethingWithTimeout(5);printf("go on to do...\r\n");return 0;}