文章目录

  • 函数原型
  • 函数使用:
  • 函数的返回值
  • 举例

函数原型

引用头文件:
#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函数使用方法相关推荐

  1. 强化学习(七) - 函数近似方法 - 随机梯度下降, 半梯度下降,及瓦片编码(Tile Coding)实例

    函数近似方法 7.1 目标预测(VE‾\overline{VE}VE) 7.2 随机梯度下降和半梯度下降 例7.1: 1000态随机行走的状态收敛 7.3 线性近似 7.4 线性方法的特征构造 7.4 ...

  2. python replace函数_Python3 replace()函数使用方法

    描述 replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次. 语法replace()方法语法: str.replac ...

  3. SQLserver 常用函数适用方法(转载)

    SQL Server 常用函数使用方法(持续更新) 之前就想要把一些 SQL 的常用函数记录下来,不过一直没有实行...嘿嘿... 直到今天用到substring()这个函数,C# 里面这个方法起始值 ...

  4. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

  5. Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

    一.类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法 ...

  6. 用指针、子函数的方法去一维数组中所有元素的平均值,并放在a[0]处

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容7]用指针.子函数的方法去一维数组中所有元素的平均值,并放 ...

  7. 用指针和函数的方法完成两个数的交换

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容6]用指针和函数的方法完成两个数的交换 传递规则:主函数 ...

  8. 有5个学生,4门课程,用子函数的方法显示平均分最高的学生的所有成绩

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容4]有5个学生,4门课程,用子函数的方法显示平均分最高的学 ...

  9. 用子函数的方法求一个3*4的数组的转置数组

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容3]用子函数的方法求一个3*4的数组的转置数组 #incl ...

最新文章

  1. java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法
  2. [Android基础] VideoView
  3. 一起学nRF51xx 14 -  temp
  4. android菜单展开收起,展开、收起状态栏 - Android社区 - https://www.androidos.net.cn/
  5. 2019 java值得学吗_Java认证值得吗?
  6. java 反射 代码_java反射机制学习代码
  7. 设计模式 - 依赖倒置原则
  8. C++查看数据存储大小端模式
  9. 异常:Invalid or unexpected token
  10. paip.广告过滤系统 php 实现
  11. 二极管双平衡混频器的原理[ZT]
  12. 区块链基础:交易模型解读
  13. 写给小白的 Asyncio 教程
  14. 云计算基础:云计算运用越来越广泛,我们应该如何去学习云计算
  15. 动态获取Bing每日壁纸
  16. 良心推荐几款好玩的生存类手游:方舟生存进化、饥荒等等
  17. springboot解决循环依赖问题
  18. cs6导航栏代码html,总算认识网页设计教程|Dreamweaver-CS6工具栏详解
  19. 大学计算机基础 小报,word制作电子小报教案.doc
  20. 盘点丨无人机与AI 深度融合及跨域应用

热门文章

  1. python中四则运算符号_Python-四则运算-蔡晓晴,杜婷萱
  2. 反射 及 Reflections反射框架
  3. HTML去掉table表格td之间的缝隙
  4. Android 打开本地第三方应用,如QQ,微博,微信等。
  5. higig、higig+、higig2
  6. 1158 Telefraud Detection
  7. MFC thread _beginthreadex CreateThread AfxBeginThread 对比
  8. def convert_dummy(df,feature,rank=0): 是什么意思
  9. 时钟编程c语言,用c语言怎么实现时钟程序?怎么编程
  10. 如何在Apache官网下载Apache服务器 安装包