alarm函数使用方法
文章目录
- 函数原型
- 函数使用:
- 函数的返回值
- 举例
函数原型
引用头文件:
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
函数使用:
1.alarm函数的作用是设置一个定时器,在seconds秒之后,将会发送SIGALRM信号给当前的进程,故而alarm函数也被称为闹钟函数。
如果不对SIGALRM信号进行忽略或者捕捉,默认情况下会退出进程。
2.如果second的值为0的话,那么定时器将会被取消。
3.如果在seconds秒内再次调用了alarm函数设置了新的闹钟,那么之前设置的秒数将会被新的闹钟时间所取代。
函数的返回值
1.如果seconds的值被设置为0,那么返回值将会是0.
2.如果在当前的定时器之前设置过定时器,那么当前定时器返回的值将是之前定时器剩余的秒数。
话不多说,我们就来验证一下吧。
举例
1.如下所示:pause()函数会使得进程处于睡眠状态,定时器定时2秒之后,发送SIGALRM信号给当前的进程,会调用settime函数,打印语句。
void settime(int signum)
{printf("begin dingshi\n");printf("signum=%d\n",signum);
}
int main()
{signal(SIGALRM,settime);int ret1 =alarm(2);pause();printf("sleep over\n");return 0;
}
2.后面设置的定时器将会覆盖掉前面的定时器,因此可以使用它进行循环定时。注意下面之所以要设置while循环的原因是因为,一旦pause函数发现信号被捕捉到之后,就会返回。因此,while循环是为了防止主进程的退出。
void settime(int signum)
{printf("begin dingshi\n");printf("signum=%d\n",signum);alarm(2);
}
int main()
{signal(SIGALRM,settime);alarm(2);while(1){pause();}return 0;
}
3.如下所示:会打印出来一次settime函数中的内容。
ret1的返回结果为0,ret2的返回结果为1.
一开始设置了2秒的定时器a,进程休眠1秒,此时定时器重新定时6秒,它覆盖了之前的定时器定时的2秒。6秒之后,主进程捕捉到SIGALRM信号,打印结果。
由于在第一次定时之前,没有旧的定时器,所以ret1的返回值为0.
而第二次定时之前,由于旧的定时器只计时了1秒就被打断了,故ret2返回的值是第一个定时器剩余的秒数也就是2-1=1秒。
void settime(int signum)
{printf("begin dingshi\n");printf("signum=%d\n",signum);
}
int main()
{signal(SIGALRM,settime);int ret1 =alarm(2);sleep(1);int ret2=alarm(6);pause();printf("ret1:%d\n",ret1);printf("ret2:%d\n",ret2);return 0;
}
这里说一点自己的理解:
2秒之后,如果进程收到了SIGALRM信号之后,它捕捉到该信号,调用用户的自定义信号处理函数时,需要看该函数是否可以拿到cpu。假设主进程一直在运行,那么即使定时器定时时间到了,它还是不能够被运行。
如下所示的代码:主进程一直在不断的进行,因此2秒定时结束了,用户自定义的函数还是不能够执行的,这也就是我们之前举的例子中,都需要将主进程sleep或者pause。
官方文档中提到过:最好不要混用sleep或者alarm函数,因为sleep()函数的实现也用到了SIGALRM信号。
void settime(int signum)
{printf("begin dingshi\n");printf("signum=%d\n",signum);
}
int main()
{signal(SIGALRM,settime);alarm(2);while(1){int i=1;printf("i=%d\n",i);}return 0;
}
下面的这个例子中,可以计算出来系统1秒可以打印出来多少个1,定时结束之后,SIGALRM信号会执行它的默认动作,即退出进程。
int main()
{// signal(SIGALRM,settime);alarm(1);int i=0;while(1){i++;printf("i=%d\n",i);}return 0;
}
alarm函数使用方法相关推荐
- 强化学习(七) - 函数近似方法 - 随机梯度下降, 半梯度下降,及瓦片编码(Tile Coding)实例
函数近似方法 7.1 目标预测(VE‾\overline{VE}VE) 7.2 随机梯度下降和半梯度下降 例7.1: 1000态随机行走的状态收敛 7.3 线性近似 7.4 线性方法的特征构造 7.4 ...
- python replace函数_Python3 replace()函数使用方法
描述 replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次. 语法replace()方法语法: str.replac ...
- SQLserver 常用函数适用方法(转载)
SQL Server 常用函数使用方法(持续更新) 之前就想要把一些 SQL 的常用函数记录下来,不过一直没有实行...嘿嘿... 直到今天用到substring()这个函数,C# 里面这个方法起始值 ...
- python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录
- Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等
一.类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法 ...
- 用指针、子函数的方法去一维数组中所有元素的平均值,并放在a[0]处
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容7]用指针.子函数的方法去一维数组中所有元素的平均值,并放 ...
- 用指针和函数的方法完成两个数的交换
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容6]用指针和函数的方法完成两个数的交换 传递规则:主函数 ...
- 有5个学生,4门课程,用子函数的方法显示平均分最高的学生的所有成绩
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容4]有5个学生,4门课程,用子函数的方法显示平均分最高的学 ...
- 用子函数的方法求一个3*4的数组的转置数组
<程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容3]用子函数的方法求一个3*4的数组的转置数组 #incl ...
最新文章
- java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法
- [Android基础] VideoView
- 一起学nRF51xx 14 - temp
- android菜单展开收起,展开、收起状态栏 - Android社区 - https://www.androidos.net.cn/
- 2019 java值得学吗_Java认证值得吗?
- java 反射 代码_java反射机制学习代码
- 设计模式 - 依赖倒置原则
- C++查看数据存储大小端模式
- 异常:Invalid or unexpected token
- paip.广告过滤系统 php 实现
- 二极管双平衡混频器的原理[ZT]
- 区块链基础:交易模型解读
- 写给小白的 Asyncio 教程
- 云计算基础:云计算运用越来越广泛,我们应该如何去学习云计算
- 动态获取Bing每日壁纸
- 良心推荐几款好玩的生存类手游:方舟生存进化、饥荒等等
- springboot解决循环依赖问题
- cs6导航栏代码html,总算认识网页设计教程|Dreamweaver-CS6工具栏详解
- 大学计算机基础 小报,word制作电子小报教案.doc
- 盘点丨无人机与AI 深度融合及跨域应用
热门文章
- python中四则运算符号_Python-四则运算-蔡晓晴,杜婷萱
- 反射 及 Reflections反射框架
- HTML去掉table表格td之间的缝隙
- Android 打开本地第三方应用,如QQ,微博,微信等。
- higig、higig+、higig2
- 1158 Telefraud Detection
- MFC thread _beginthreadex CreateThread AfxBeginThread 对比
- def convert_dummy(df,feature,rank=0): 是什么意思
- 时钟编程c语言,用c语言怎么实现时钟程序?怎么编程
- 如何在Apache官网下载Apache服务器 安装包