Linux中alarm/setitimer函数(信号函数)

alarm函数

函数原型: unsigned int alarm(unsigned int seconds);

函数描述:设置定时器(闹钟)。在指定seconds后,内核会给当前进程发送 14)SIGALRM信号。进程收到该信号,默认动作终止。每个进程都有且唯一的一个定时器。

函数返回值:返回0或者剩余的秒数,无失败。

alarm() returns the number of seconds remaining  until  any  previouslyscheduled alarm was due to be delivered, or zero if there was no previ‐ously scheduled alarm.

alarm(5)-----------sleep(2)---------->alarm(5)->接下来还是5秒后产生SIGALRM信号

 return 0;                                               return 3(之前的定时器还差3second结束);

取消定时器:alarm(0),返回旧闹钟剩余的秒数

测试:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <signal.h>
void handler(int signo)
{printf("signo==[%d]\n",signo);
}
int main()
{
//给内核注册信号捕捉函数,看看是不是发送SIFGALRM信号signal(SIGALRM,handler);int n=alarm(10);printf("n==[%d]\n",n);sleep(2);n=alarm(2);//2秒后发送信号printf("n==[%d]\n",n);sleep(5);//让进程休息5秒,不然进程结束,也收不到信号了
}

运行结果我们也可以发现给进程发出SIGALRM信号时,该进程直接终止,并没有sleep(5)那么久才结束

因为sleep()和阻塞时遇到信号会中断,并产生EINTR错误

闹钟实际执行时间=系统时间+用户时间+损耗时间

我们通过测试电脑一秒中能打印多少的数字(printf("[%d]\n",i++);)可知:

调用printf函数打印数字遇到\n才会打印,打印过程涉及到从用户区到内核区的切换(打印一次切换一次),切换次数越多消耗的时间越长,效率越低,损耗的时间越多。

而我们使用文件重定向操作时(./ arlarm > test.log->写到test.log),由于文件操作带缓冲,所以涉及到用户区到内核区的切换次数大大减少(缓冲区满了才从用户区切换到内核区),从而使损耗大大降低

setitimer函数:

函数原型: int setitimer(int which, const struct itimerval *new_value,
                     struct itimerval *old_value);

函数作用:设置定时器,可代替alarm函数,精度微秒us,可以实现周期定时。

函数参数:

which:指定定时方式

自然定时:ITIMER_REAL(计算自然时间) This  timer counts down in real (i.e., wall clock) time.At each expiration, a SIGALRM(14) signal is generated.虚拟空间计时(用户空间):ITIMER_VIRTUAL(只计算进程占用cpu的时间) This timer counts down against the  user-mode  CPU  timeconsumed  by the process.  (The measurement includes CPUtime consumed by all threads in the process.)   At  eachexpiration, a SIGVTALRM signal is generated.运行时计时(用户+内核)ITIMER_PROF(计算占用cpu及执行系统调用的时间)    This  timer  counts  down  against the total (i.e., bothuser and system) CPU time consumed by the process.  (Themeasurement includes CPU time consumed by all threads inthe process.)  At each expiration, a SIGPROF  signal  isgenerated.In  conjunction  with  ITIMER_VIRTUAL, this timer can beused to profile user and system CPU time consumed by theprocess.

 new value:负责设定timeout时间

old_value:存放旧的timeout值,一般设为NULL

 struct itimerval {struct timeval it_interval;设定以后每几秒执行function(周期)struct timeval it_value;设定什么时候执行第一次function};struct timeval {time_t      tv_sec;         秒suseconds_t tv_usec;       微秒};

测试;

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include <signal.h>
#include <sys/time.h>
void handler(int signo)
{printf("signo=[%d]\n",signo);
//alarm(0);可以取消计时器
}
int main()
{
//	signal(SIGALRM,handler);//int setitimer(int which, const struct itimerval *new_value,//   struct itimerval *old_value);struct itimerval value;
//设置间隔value.it_interval.tv_sec=1;value.it_interval.tv_usec=0;//因为在栈上,不初始化会随机值
//设置第一次发信号的时间value.it_value.tv_sec=2;value.it_value.tv_usec=0;setitimer(ITIMER_REAL,&value,NULL);
//一直执行进程while(1){sleep(1);}}

结果:2秒之后每隔1秒打印编号:

如果我们不写SIGALRM的信号处理函数,接收到SIGALRM后会直接终止进程(默认行为)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【栈】LCR 036. 逆波兰表达式求值

LCR 036. 逆波兰表达式求值 解题思路 初始化栈&#xff1a; 创建一个整数栈用于存储操作数。 遍历表达式数组&#xff1a; 对于数组中的每个元素&#xff1a; 如果是运算符&#xff0c;从栈中弹出两个操作数&#xff0c;并根据运算符进行相应的运算&#xff0c;然后将结果压…

git工具

一、命令行工具 二、Git 客户端可视化工具-推荐 1.常用工具 tortoisegit 官网 https://tortoisegit.org/ 推荐 sourcetree 官网https://www.sourcetreeapp.com/ 2.tortoisegit安装 2.1 下载安装包 2.2 下载语言包 2.3 安装 2.4 安装语言包 5.使用 5.1 新建分支 5.2 切换分支…

python基础教程—总结篇

这篇是Python基础教程系列的总结篇&#xff0c;这里这个专栏的地址&#xff1a;《Python教程》 首先必须声明一点&#xff0c;这是基础教程&#xff0c;所以面向的是新人&#xff0c;没有学过Python的同学&#xff0c;所以这套教程并没有涉及到比较难的并发编程模块&#xff0…

数字世界的探索者:计算机相关专业电影精选推荐

目录 推荐计算机专业必看的几部电影 《黑客帝国》 《社交网络》 《乔布斯传》 《心灵捕手》 《源代码》 《盗梦空间》 《头号玩家》 《我是谁&#xff1a;没有绝对安全的系统》 《战争游戏》(WarGames) 《模仿游戏》(The Imitation Game) 《硅谷》(Silicon Valley) …

2024洞见丨暴雨信息总裁孙辉:未来进行时

这是一个动荡的时代&#xff0c;政经环境风云变幻&#xff0c;诸多因素复杂交织&#xff0c;全球经济踯躅前行&#xff0c;世界秩序艰难重塑&#xff1b;这也是一个变革的时代&#xff0c;能源与数字技术加速融合演进&#xff0c;大模型和生成式AI一路狂奔&#xff0c;内卷和跨…

qt_day3

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置账户和密码的登录标签ui->lab1->setPixmap(QPixmap(":/pictrue/wodepeizhenshi.png"));…

51_蓝桥杯_独立按键

一 电路 注意&#xff1a;J5跳帽接到2~3引脚&#xff0c;使按键S4-S5四个按键的另外一端接地&#xff0c;从而成为4个独立按键。 二 独立按键工作原理 三 代码 代码1&#xff1a;按下S7点亮L1指示灯&#xff0c;松开按键&#xff0c;指示灯熄灭&#xff0c;按下S6点亮L2指示灯…

电流回路是分析电路图的基础,看看这个电路你会更明白

任何电器要想开始工作&#xff0c;都离不开供电&#xff0c;而要供电就离不开电源。电源有两个极即:电源正极()、电源负极(-)&#xff0c;电源要实现向负载供电&#xff0c;必须是电源正极()流出电流经负载再流回电源负极(-)&#xff0c;这时可以说这个电路构成了供电电流回路了…

nginx优化配置

一 全局配置的六个模块简介 全局块&#xff1a;全局配置&#xff0c;对全局生效 events块&#xff1a;配置影响 Nginx 服务器与用户的网络连接 http块&#xff1a;配置代理&#xff0c;缓存&#xff0c;日志定义等绝大多数功能和第三方模块的配置 server块&#xff1a;配置…

阿里云幻兽帕鲁服务器续费还有优惠吗?老用户续费的价格很贵怎么办?

最近很多人在问&#xff0c;上个月买的阿里云幻兽帕鲁服务器续费是不是没有优惠了&#xff0c;因为他们发现续费的价格比之前贵了很多&#xff0c;之前是不到30元一个月。 其实目前的续费优惠是有的&#xff0c;有但不多&#xff0c;方法就是进入阿里云服务器ECS控制台&#x…

Linux环境下整体备份迁移Docker镜像及数据

我们在使用Docker时&#xff0c;考虑其很大的优势可能是可移植性和快速部署&#xff1a; Docker容器可以在任何支持Docker的操作系统上运行&#xff0c;无论是在物理机上、虚拟机上&#xff0c;还是在云上。这种可移植性使得开发人员能够在不同环境中轻松部署和运行应用程序。…

设计模式四:适配器模式

1、适配器模式的理解 适配器模式可以理解为有两个现成的类Adaptee和Target&#xff0c;它们两个是不能动的&#xff0c;要求必须使用B这个类来实现一个功能&#xff0c;但是A的内容是能复用的&#xff0c;这个时候我们需要编写一个转换器 适配器模式 Adaptee&#xff1a;被适…

【C++初阶】类和对象(上)

目录 一.类的引入 1.概念 2.类的定义 (1).语法规范 (2)命名规范 (3)类的访问限定符及封装 ①访问限定符 (4)类的两种定义 ①声明和定义全部放在类体中&#xff0c;需注意&#xff1a;成员函数如果在类中定义&#xff0c;编译器可能会将其当成内联函数处理。 ​编辑…

【IDEA使用安装】如何长期正常使用IDEA,告别弹窗?【2024年亲测】

IDEA最新使用指南 写在前面涉及知识1、官网下载最新版本IDEA2、安装IDEA版本3、正常使用IDEA软件4、作者寄语 写在前面 愉快的假期结束了&#xff0c;当然我们奋斗的步伐不能停止&#xff0c;随即迎来了2024年的全新挑战&#xff0c;学更多的知识&#xff0c;分享更多有用的硬…

langchain配置openai

langchain的新版很多操作都变了&#xff0c;国内使用openai也不大方便&#xff0c;好在发现了个宝藏网站&#xff0c;可以使用 网址&#xff0c;接口的调用与官网是完全一样的 langchain调用各种大模型非常方便&#xff0c;也不用担心接口经常变动&#xff0c;导致和gradio等程…

【Flink状态管理五】Checkpoint的设计与实现

文章目录 1. Checkpoint的整体设计2. Checkpoint创建源码解析2.1. DefaultExecutionGraphBuilder.buildGraph2.2. ExecutionGraph.enableCheckpointing 由于系统原因导致Flink作业无法正常运行的情况非常多&#xff0c;且很多时候都是无法避免的。对于Flink集群来讲&#xff0c…

flume系列之:查找Topic所在flume agent组,查看flume agent组重复接入的Topic

flume系列之:查找Topic所在flume agent组,查看flume agent组重复接入的Topic 一、查找Topic所在flume agent组二、查看flume agent组重复接入的Topic三、找出重复的topic和不存在的Topic一、查找Topic所在flume agent组 import collectionsimport requests import datetime …

opencv图像处理(一)

一. OpenCV 简介 OpenCV 是一个跨平台计算机视觉库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 应用领域 1、人机互动 2、物体识别 3、图像分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、…

几道简单的C++练手题

第 1 题 【 问答题 】 • 生理周期(2022.12) 人生来就有三个生理周期&#xff0c;分别为体力、感情和智力周期&#xff0c;它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天&#xff0c;人会在相应的方面表现出色。例如&#xff0c;智力周期的高峰…

整数分块 (因数平方和)(余数之和)

整数分块 文章目录 整数分块例题1&#xff1a;因数平方和分析:具体代码&#xff1a;__int128写法逆元写法 例题2&#xff1a;余数之和思想&#xff1a;代码 一般在算法中遇到时间复杂度为1e9的&#xff0c; 那么一次 O ( n ) O(n) O(n)的遍历无法解决问题 求 ∑ i 1 n [ n i ]…