代码来自 unix环境高级编程第三版 一书
学无止境不耻下问 includestdio.com
#include <apue.h>
#include <setjmp.h>
static jmp_buf env_alrm; /* version 2 */
static void sig_alrm(int signo)
{
longjmp(env_alrm,1); /* versin 2 */
/* nothing to do , just return to wake up the pause (version 1) */
}
static void sig_int(int signo)
{
int i,j;
volatile int k;
printf("\nsig_int starting\n");
/*这里的循环设计 运行时间尽可能大于传给sleep1函数的时间*/
for(i=0; i< 300000; i++)
for(j=0; j<4000; j++)
k += i*j;
printf("sig_int finished\n");
}
unsigned int sleep1(unsigned int seconds)
{
if(signal(SIGALRM,sig_alrm) == SIG_ERR)
return(seconds);
if(setjmp(env_alrm) == 0){ // version 2
alarm(seconds); /*start the timer*/
pause(); /*next caught signal wakes us up*/
} // version 2
return(alarm(0)); /*turn off timer, return unslept time*/
}
int main(void){
unsigned int unsilept;
/*这里设计键入中断键 ctrl + c 由于闹钟已经到时 longjmp 并没有执行完sig_int 提早的结束了程序*/
if(signal(SIGINT,sig_int))
err_sys("signal(SIGINT) error");
unsilept = sleep1(3);
printf("sleep2 returned: %u \n",unsilept);
exit(0);
}