linux定时器之alarm
来源:互联网 发布:淘宝司法拍卖商铺税费 编辑:程序博客网 时间:2024/05/21 21:47
出处:http://blog.csdn.net/u010155023/article/details/51984602
1. alarm函数
2. 测试
原文的测试环境是RedHat Linux5.3,本人在Ubuntu 14.04中再次进行了测试。测试结果与原作者一致。
了解了alarm()函数的功能特性和返回值的特性后,我们就可以对其测试。测试方向有两个:其一,测试常规只单独存在一个闹钟函数alarm()的程序;其二,测试程序中包含多个alarm()闹钟函数。因此整理了下面几个程序,通过比较学习更有助于理解。测试环境是RedHat Linux5.3,GCC编译调试。
2.1 alarm()测试1.1
程序分析:在文件test1.c中,定义了一个时钟alarm(10),它的作用是让信号SIGALRM在经过10秒后传送给目前main()所在进程;接着又定义了sleep(15),它的作用是让执行挂起15秒的时间。所以当main()程序挂起10秒钟时,signal函数调用SIGALRM信号的处理函数sig_alarm,并且sig_alarm执行exit(0)使得程序直接退出。因此,printf("Hello World!\n")语句是没有被执行的。
2.2 alarm()测试1.2
程序分析:与test1.c文件不同的是,在文件test2.c中延时函数为sleep(5),即执行挂起5秒的时间。所以当main()程序挂起5秒钟时,由于还没到达设置的闹钟10秒,那么main就执行下面的printf("Hello World!\n")语句;紧接着又执行下面的return 0语句,从而直接退出程序。因此,整个test2.c文件输出的内容为:Hello World!。
2.3 alarm()测试2
程序分析:在文件test3.c中,定义时钟alarm(5),而main()函数中主要是一个for循环输出语句。当main函数执行到i=5时,for循环先执行printf("sleep %d ...\n", 5)语句输出"sleep 5 ...",然后执行sleep(1)语句。此时已经到达闹钟时间5秒,因此会把信号SIGALRM传送给当前main()函数进程;接着调用SIGALRM信号的处理函数handler,从而输出"hello",然后又返回到sleep(1)这个点;最后for循环执行i=6,输出"sleep 6",最终延时1秒后结束整个程序。
以上三个程序都只包含一个alarm()闹钟函数,下面两个程序包含两个alarm()。并且为了更为真切的观察包含alarm()闹钟函数的程序的执行过程,程序通过调用系统打印输出当前时间,通过时间差来进一步理解。
2.4 alarm()测试3.1
程序分析:在test4.c的main()函数中,先设置了一个闹钟函数alarm(20),即在20秒时将SIGALRM信号传送送给当前进程;然后又定义了一个延时函数sleep(5),接着又定义了一个闹钟函数alarm(15),它的作用是清除前面设置的闹钟alarm(20)并返回剩余的时间20-5=15秒。所以,程序先执行system("date")语句输出当前时间;然后进程休眠5秒后,程序执行输出语句printf("%d\n",alarm(15)),由于alarm(15)先返回15秒,即打印输出15;接着程序执行pause()函数,使当前进程处于挂起状态,直到捕捉到一个信号;当再过15秒后,SIGALARM信号的处理函数sig_alrm执行system("date")语句输出当前时间;最后pause终止进程。因此,整个程序执行的时间为5+15=20秒。
2.5 alarm()测试3.2
程序分析:与test4.c文件不同的是,在文件test5.c中闹钟函数为alarm(5)。因此,整个程序执行的时间为5+5=10秒。值得注意的是,alarm(0)
表示清除之前设置的闹钟信号,并返回0。因为,如果这里把alarm(5)改成alarm(0),那么整个程序执行的时间为5+0=5秒。
最后:需要注意的是,原作者在文章中进行了精确的时间计算,而程序运行的结果也与作者的计算一致,但即使如此,精确的结果也是不可信的和计算精确的结果也是不可行的。在某些条件下,我们实际花费和等待的时间很有可能比程序设定的时间要长,而且1秒对于现代的操作系统来说,实在是太长了。
- linux定时器之alarm
- 小记——linux定时器之alarm
- Linux 定时器alarm()
- linux c之alarm函数的使用,定时器的实现
- linux进程间通信方式之定时器信号alarm
- linux C之alarm()
- Linux下的定时器:alarm()与setitimer()
- Linux下的定时器:alarm()与setitimer()
- Linux下的定时器:alarm()与setitimer()
- Linux下的定时器:alarm()与setitimer()
- Linux下的定时器:alarm()与 setitimer()
- Linux下的定时器:alarm()与setitimer()
- Linux下的定时器:alarm()与setitimer()
- linux下定时器的使用 - alarm() & setitimer()
- Linux下的定时器:alarm()与setitimer()
- Linux下的定时器:alarm()与setitimer()
- linux C之alarm函数
- linux C之alarm函数
- 9. Java面向对象的三个特征与含义。
- H5Server Sent Event服务端主动发送数据回客户端
- freemarker生成静态页面打开乱码,但是源码不乱
- POJ2811 未完成
- 机器学习--物以类聚(k-means算法)
- linux定时器之alarm
- Search
- [noip 2017]普及组 T4
- 类成员函数参数为该类某个静态成员函数指针,需要在静态函数内使用当前实例的非静态数据成员
- Spring Boot应用连接数据库MySQL,并编写自定义SQL
- Docker命令小记。
- opencv提取截获图像,任意区域
- 写代码实现堆溢出、栈溢出、永久代溢出、直接内存溢出
- 通过导数求极值