1. alarm函数

[cpp] view plain copy
  1. [1] 引用头文件:#include <unistd.h>;
  2. [2] 函数标准式:unsigned int alarm(unsigned int seconds);
  3. [3] 功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。
  4. [4] 函数返回值:如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代;当参数seconds为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回。

2. 测试

原文的测试环境是RedHat Linux5.3,本人在Ubuntu 14.04中再次进行了测试。测试结果与原作者一致。

了解了alarm()函数的功能特性和返回值的特性后,我们就可以对其测试。测试方向有两个:其一,测试常规只单独存在一个闹钟函数alarm()的程序;其二,测试程序中包含多个alarm()闹钟函数。因此整理了下面几个程序,通过比较学习更有助于理解。测试环境是RedHat Linux5.3,GCC编译调试。

2.1 alarm()测试1.1
[cpp] view plain copy
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. void sig_alarm()
  6. {
  7. exit(0);
  8. }
  9. int main(int argc, char *argv[])
  10. {
  11. signal(SIGALRM, sig_alarm);
  12. alarm(10);
  13. sleep(15);
  14. printf("Hello World!\n");
  15. return 0;
  16. }

程序分析:在文件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
[cpp] view plain copy
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. void sig_alarm()
  6. {
  7. exit(0);
  8. }
  9. int main(int argc, char *argv[])
  10. {
  11. signal(SIGALRM, sig_alarm);
  12. alarm(10);
  13. sleep(5);
  14. printf("Hello World!\n");
  15. return 0;
  16. }

程序分析:与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
[cpp] view plain copy
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. void handler()
  6. {
  7. printf("hello\n");
  8. }
  9. void main()
  10. {
  11. int i;
  12. signal(SIGALRM, handler);
  13. alarm(5);
  14. for(i = 1; i < 7; i++)
  15. {
  16. printf("sleep %d ...\n", i);
  17. sleep(1);
  18. }
  19. }

程序分析:在文件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
[cpp] view plain copy
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. static void sig_alrm(int signo);
  6. int main(void)
  7. {
  8. signal(SIGALRM,sig_alrm);
  9. system("date");
  10. alarm(20);
  11. sleep(5);
  12. printf("%d\n",alarm(15));
  13. pause();
  14. }
  15. static void sig_alrm(int signo){
  16. system("date");
  17. return;
  18. }

程序分析:在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
[cpp] view plain copy
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. static void sig_alrm(int signo);
  6. int main(void)
  7. {
  8. signal(SIGALRM,sig_alrm);
  9. system("date");
  10. alarm(20);
  11. sleep(5);
  12. printf("%d\n",alarm(5));
  13. pause();
  14. }
  15. static void sig_alrm(int signo){
  16. system("date");
  17. return;
  18. }

程序分析:与test4.c文件不同的是,在文件test5.c中闹钟函数为alarm(5)。因此,整个程序执行的时间为5+5=10秒。值得注意的是,alarm(0)表示清除之前设置的闹钟信号,并返回0。因为,如果这里把alarm(5)改成alarm(0),那么整个程序执行的时间为5+0=5秒。

最后:需要注意的是,原作者在文章中进行了精确的时间计算,而程序运行的结果也与作者的计算一致,但即使如此,精确的结果也是不可信的和计算精确的结果也是不可行的。在某些条件下,我们实际花费和等待的时间很有可能比程序设定的时间要长,而且1秒对于现代的操作系统来说,实在是太长了。

原文链接:https://blog.csdn.net/u010155023/article/details/51984602

linux之alarm函数相关推荐

  1. linux内核alarm,linux中alarm函数的实例讲解

    linux alarm函数简介 上代码: #include #include #include #include int main(int argc, char *argv[]) { alarm(5) ...

  2. linux alarm函数使用

    unsigned int alarm(unsigned int seconds) 函数作用:在seconds秒之后向调用alarm()的进程发送一个SIGALRM信号. 1.如果指定seconds是0 ...

  3. linux sleep alarm,Linux环境编程之信号处理(三、利用alarm()和pause()函数实现sleep()函数)...

    sleep()是执行挂起一段时间,而alarm()函数是定时器,pause()函数则是挂起进程,当出现信号打断时,才会继续往前执行: 先来分享下alarm()函数,alarm()函数用来设置一个定时器 ...

  4. linux C之alarm函数(更改)

    http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seconds指定 ...

  5. Linux系统编程——alarm函数

    alarm函数 函数原型:unsigned int alarm(unsigned int seconds); 函数描述:设置定时器(闹钟).在指定seconds后,内核会给当前进程发送14)SIGAL ...

  6. linux c语言sleep函数的头文件,C语言中的pause()函数和alarm()函数以及sleep()函数

    C语言pause()函数:让进程暂停直到信号出现头文件: #include 定义函数: int pause(void); 函数说明:pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(si ...

  7. linux内核alarm,linux C之alarm函数

    alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程.如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回.要注意 ...

  8. Linux下闹钟函数alarm的常见用法

    alarm(闹钟函数),是一个比较简单且实用的函数.当定时器指定的时间到时,它向进程发送SIGALRM信号.可以设置忽略或者不捕获此信号,如果采用默认方式其动作是终止调用该alarm函数的进程. 在调 ...

  9. linux下signal()函数超详细介绍

    1. 功能 设置某一信号的对应动作 2. 声明 #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t si ...

最新文章

  1. apue读书笔记-第十二章
  2. 从视频到语言: 视频标题生成与描述研究综述
  3. 小白的算法初识课堂(part3)--递归
  4. java statement 返回类型,6.3 返回类型和返回语句 | Return type Return statement
  5. python爬虫加密空间_Python爬虫进阶必备 | XX同城加密分析
  6. svg 自己做动画图片 GSAP真的好用
  7. Linux内核vmalloc原理与实现
  8. Java执行jar总结
  9. Arcpy实现dem数据主河网自动提取
  10. 使用Mathcad解受迫振动微分方程并画图
  11. udp数据包大小问题
  12. 阿里云ECS服务器组内网
  13. Bath Body 純白花漾系列
  14. Mac电脑程序无响应怎么办?mac强制关闭软件的6种方法
  15. 2020年元宵节健康
  16. SAP 获取本机信息(IP及电脑名称)
  17. 香港服务器机房等级说明
  18. 海外仓物流有哪些优缺点
  19. python barrier_Python中的Barrier对象
  20. linux赛门铁克扫描,赛门铁克数据扫描程序(Symantec Data Scanner, SDS)技术简介

热门文章

  1. (计算机视觉课程-笔记1)图像边缘检测
  2. 学习unity的第一个游戏-Playground
  3. 别让企业发展成为悲剧
  4. JAVA 连接 Exchange服务
  5. ant design vue 当中的表格自定义结构超出隐藏的自适应 动态显示省略号
  6. 失败了,让我们共同买单
  7. Git清除所有历史记录
  8. 【深度】通俗了解异构计算
  9. ExoPlayer 监听播放器播放完成 播放孔娜
  10. 【IoT】从华为的角度来谈谈如何做战略规划