施用alarm和setjmp实现超时控制
使用alarm和setjmp实现超时控制
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <setjmp.h> #define JMP_VALUE 12345 static 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; }