#include
int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact); 功能:拦截下signum消息,用act所给的方式处理,将原来的处理方式存在oldact(一般oldact设为NULL); 参数:signum:需要拦截的消息,这里是SIGALRM; act:处理中断的方式,是一个结构体,后面会介绍这结构体; oldact:用来存储原来的处理方式,一般为NULL,表示忽略; /****************************************************************/ /***********结构体:struct sigaction(知道的可以不用看)*******/ struct sigaction { void (*sa_handler)(int); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); } 成员:第一个sa_handler就是中断处理程序的入口,比如:要用alarm程序处理这个中断,就讲此值设为alarm; sa_mask:表示在中断处理中要屏蔽的中断; sa_flags:这是很关键的东西~它包含了一些影响中断处理过程方式的标志,具体取值如下: SA_NOCLDSTOP:这表示如果所处理的中断是SIGCHLD,由于收到其他信号而导致了子进程终止,将不发送SIG_CHLD; SA_ONESHOT or SA_RESETHAND:sa_handler所指向的中断处理程序只被执行一次,之后将设为默认的中断处理程序; SA_RESTART:让被处理的系统调用在中断返回后重新执行; SA_NOMASK or SA_NODEFFER(这就是我们要用的):在中断处理程序执行时,不平比自己的中断信号; 要考虑的成员就是上面的两个至于其他两个于要处理的问题关系不大,大家可以查书看看 /***********************************************************/ 好啦~到这说的就差不多了~下面举个例子(这不是个完全的程序,只是写了我们所关心的部分) 代码: /*省略include*/ int main() { /*省略部分变量定义*/ struct sigaction alr; memset(&alr,0,sizeof(struct sigaction)); alr.sa_handler=alarmed;/*用alarmed函数处理*/ alr.sa_flags=SA_NOMASK;/*具体含义见前文*/ alr.sa_restorer-NULL; sigaction(SIGALRM,&alr,NULL);/*需要捕捉SIGALRM消息,具体处理方式在alr结构体中,不关心原来的处理方式*/ /*假设有一个已经设置好的struct sockaddr_in的结构体,名字是addr,和一个已经用bind函数处理完的套接字,变量名是:fd*/ for( ; ; ) { alarm(60);/*60秒后,如果仍处于阻塞状态就重传*/ recvfrom(/*具体参数我就不说了,反正就是调用了一个recvfrom函数);*/ /*以下省略若干*/ } } void alarmed(int signo) { sendto(/*向发送端传送特殊数据包(自己定义,爱什么样什么样),当发送端收到这数据包后,就重传一遍刚才发送的数据(自然这个功能你得自己写……)*/ return; } /*这个程序……反正大家看懂就好啦~省略了很多检验机制……别跟我学…………*/