1: #include <signal.h> 2: #include <setjmp.h> 3: 4: static jmp_buf jmp; 5: 6: sleep(n) 7: unsigned n; 8: { 9: int sleepx(); 10: unsigned altime; 11: int (*alsig)() = SIG_DFL; 12: 13: if (n==0) 14: return; 15: altime = alarm(1000); /* time to maneuver */ 16: if (setjmp(jmp)) { 17: signal(SIGALRM, alsig); 18: alarm(altime); 19: return; 20: } 21: if (altime) { 22: if (altime > n) 23: altime -= n; 24: else { 25: n = altime; 26: altime = 1; 27: } 28: } 29: alsig = signal(SIGALRM, sleepx); 30: alarm(n); 31: for(;;) 32: pause(); 33: /*NOTREACHED*/ 34: } 35: 36: static 37: sleepx() 38: { 39: longjmp(jmp, 1); 40: }