当前位置:首页 > 芯闻号 > 充电吧
[导读] 1. alarm函数 [cpp] view plain copy [1] 引用头文件:#include ;      [2] 函数标准式:unsigned int alarm(

1. alarm函数

[cpp] view plain copy [1] 引用头文件:#include ;      [2] 函数标准式:unsigned int alarm(unsigned int seconds);      [3] 功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。      [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 #include    #include    #include    #include       void sig_alarm()    {      exit(0);    }   int main(int argc, char *argv[])    {      signal(SIGALRM, sig_alarm);      alarm(10);      sleep(15);      printf("Hello World!n");      return 0;    }  

程序分析:在文件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 #include    #include    #include    #include       void sig_alarm()    {      exit(0);    }    int main(int argc, char *argv[])    {      signal(SIGALRM, sig_alarm);      alarm(10);      sleep(5);      printf("Hello World!n");      return 0;    }  

程序分析:与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 #include    #include    #include    #include       void handler()   {     printf("hellon");   }      void main()   {     int i;     signal(SIGALRM, handler);     alarm(5);     for(i = 1; i < 7; i++)     {       printf("sleep %d ...n", i);       sleep(1);     }   }  

程序分析:在文件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 #include    #include    #include    #include       static void sig_alrm(int signo);   int main(void)   {     signal(SIGALRM,sig_alrm);     system("date");     alarm(20);     sleep(5);     printf("%dn",alarm(15));     pause();   }      static void sig_alrm(int signo){     system("date");     return;   }  

程序分析:在test4.c的main()函数中,先设置了一个闹钟函数alarm(20),即在20秒时将SIGALRM信号传送送给当前进程;然后又定义了一个延时函数sleep(5),接着又定义了一个闹钟函数alarm(15),它的作用是清除前面设置的闹钟alarm(20)并返回剩余的时间20-5=15秒。所以,程序先执行system("date")语句输出当前时间;然后进程休眠5秒后,程序执行输出语句printf("%dn",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 #include    #include    #include    #include       static void sig_alrm(int signo);   int main(void)   {     signal(SIGALRM,sig_alrm);     system("date");     alarm(20);     sleep(5);     printf("%dn",alarm(5));     pause();   }      static void sig_alrm(int signo){     system("date");     return;   }  

程序分析:与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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭