别人问过,没有答案,我再问一次,为什么alarm不会结束getchar调用? [code] signal(SIGALRM,t_out); alarm(TIMEOUT); printf("timeout ==[%d]\n",TIMEOUT); getchar() //此处原来是用的tcp函数 read ,后来为了调试方便改成getchar的 alarm(0); 超时函数 void t_out() { int i; printf("run timeout\n"); return; } 现在运行结果: 设置TIMEOUT=2秒,发现到2秒能转到t_out函数,并输...
基本上是从书上抄的一小段代码如下, 问大家一个问题:
在定时器还没有超时,从read返回,这时候要调用alarm(0)关闭定时器,不然就不能表达程序原来的意思.
但若此时运行此程序的系统是一个繁忙的系统, 且在read后alarlm前,系统转去执行其他程序,就是说有可能过了
20秒后此进程得到调度, 这时程序肯定会先去执行sig_alrm(),退出进程.但这样的过程肯定不是程序本来的意思.
请问大家有没有可能会出现这种情况?怎样解决?
#include
我在写一个简化的link-state router的模拟,现在的情况是,需要每秒钟执行一个checking routine,整个过程中都要用recvfrom来接受数据包。把程序简化之后大致是这个样子:
[CODE]
#include
unsigned int alarm(unsigned int seconds); 每个进程只能有一个alarm,所以对这个函数的用法要考虑进程原来是否已经有一个alarm。 1. 进程先前没有alarm,则用alarm(...)可以设置一个alarm,时间到的时候就会1)如果没有设置捕捉SIGalarm,则终止进程 2).如果设置了捕捉SIGalarm,则运行用户捕捉函数。 2. 进程已经有一个alarm。调用alarm(...),则用现在设置的alarm覆盖原来的alarm,返回值为以前那个alarm的剩余时间。 int pause...
unsigned int alarm(unsigned int seconds); 每个进程只能有一个alarm,所以对这个函数的用法要考虑进程原来是否已经有一个alarm。 1. 进程先前没有alarm,则用alarm(...)可以设置一个alarm,时间到的时候就会1)如果没有设置捕捉SIGalarm,则终止进程 2).如果设置了捕捉SIGalarm,则运行用户捕捉函数。 2. 进程已经有一个alarm。调用alarm(...),则用现在设置的alarm覆盖原来的alarm,返回值为以前那个alarm的剩余时间。 int pause...