#include <signal.h>#include <stdio.h>#include <setjmp.h>/**//* * signal function use sigaction * */typedef void Sigfunc(int signo);static jmp_buf env_alarm;Sigfunc* signal1(int signo,Sigfunc* func){ struct sigaction act,oact; act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = 0; if(signo==SIGALRM) //timer { #ifdef SA_INTERRUPT act.sa_flags |= SA_INTERRUPT; #endif } else { #ifdef SA_RESTART act.sa_flags |= SA_RESTART; #endif } if(sigaction(signo,&act,&oact)<0) return (SIG_ERR); return (oact.sa_handler);}void sig_proc(int signo){ //timeout then return longjmp(env_alarm,10); //10 means return value is 10;}int main(){ int i=1; int jmpret; if(signal1(SIGALRM,sig_proc)==SIG_ERR) { printf("signal SIGALRM error\n"); return -1; } if((jmpret=setjmp(env_alarm))!=0) //longjmp return { printf("time out! return %d.\n",jmpret);// here will print return 10. return 0; } alarm(2); //set timeer 2 second,and then call the sig_proc while(i) { if(i%3==0) printf("the value is:%d\n",i); i++; } alarm(0); return 0;}使用sigaction来实现signal函数,然后用一个例子测试一下.该例子打印3的倍数,两秒运行后接收到SIGALRM信号. 超时退出. 转载于:https://www.cnblogs.com/shipfi/archive/2008/04/23/1167858.html