ualarm()函数浅析
函数原型
//come from /usr/include/unistd.h
extern __useconds_t ualarm(__useconds_t __value,__useconds_t __interval)
函数调用成功时,返回原alarm()函数剩余的微秒数,若不存在alarm()函数则返回0,出错的情况下返回-1;
详细描述看man中的介绍。
注意看ERRORS:EINVAL 说函数中的两个参数不小于1000000时候,将会出错。所以使用时候注意参数的大小。
看下面本人写的一个测试程序:
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
void handler(void)
{
printf("time up\n");
}
int main()
{
int i=0;
int rev;
signal(SIGALRM,(__sighandler_t)handler);
rev=ualarm(999999,500000);
if(rev==-1)
{
perror("ualarm:");
exit(1);
}
while(1)
{
sleep(1);
printf("i=%d\n",i++);
}
return 0;
}
按照程序的本意应该是每秒输出两次time up,输出一次i的数值,真实的结果是这样吗?不是!可以自己测试下看看,把ualarm(999999,500000);中第二个参数改为200000希望每秒能输出5次time up,输出一次i的数值,但你运行的结果发现还是不对,以上的结果都是输出一次time up后,输出一次i的数值。看下面
但是,time up输出的频率确实和ualarm()函数设定的是相吻合,这样我们可以估计一下,使用ualarm()对sleep()函数产生了干扰。就是说在每次软中断后会造成sleep()函数的退出。
原因分析:
以下是我在网上找到的一段话,感觉应该能是这个问题,但是目前还不太确定,因为有人这么说,sleep()与alarm(),本质他们是不同的,sleep是拨了一个临时实时定时器并等待定时器到期,而alarm是用进程唯一的实时定时器来定时唤醒等待信号到来的进程执行。按照上述的见解,那就应该没问题了,暂且把这个问题归为我说的那样吧,要是哪位博友看到了,明白的话,满帆给哦讲解一下,谢谢哈。
关于信号的一些函数:
1.kill产生一个信号: