【LinuxC语言】setitimer与getitimer函数

文章目录

  • 前言
  • 一、setitimer() 函数
  • 二、getitimer() 函数
  • 三、示例代码
  • 总结


前言

在Linux系统下,编写程序时经常需要使用定时器来实现一些定时任务、超时处理等功能。setitimer() 和 getitimer() 函数是两个用于操作定时器的重要函数。它们可以帮助我们设置定时器的值、获取定时器的当前值等操作,为编写高效的定时器相关功能提供了强大的支持。


一、setitimer() 函数

  • 函数原型:

    int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
    
  • 参数:

    • which:指定定时器类型,可以是 ITIMER_REALITIMER_VIRTUALITIMER_PROF
      ITIMER_REALITIMER_VIRTUALITIMER_PROF 是用于指定定时器类型的常量,它们分别代表了不同的定时器类型,具有不同的作用:
  1. ITIMER_REAL

    • 作用:用于实现真实时间定时器。
    • 特点:当定时器到期时,会发送 SIGALRM 信号给进程,即实际时间过去后触发。
    • 用途:通常用于实现计时、定时任务、超时处理等功能。
  2. ITIMER_VIRTUAL

    • 作用:用于实现虚拟时间定时器。
    • 特点:定时器仅在进程花费在用户态的时间时减少。
    • 用途:通常用于统计进程的用户态运行时间,例如性能分析、资源消耗分析等。
  3. ITIMER_PROF

    • 作用:用于实现进程 CPU 时间定时器。
    • 特点:定时器仅在进程花费在用户态和内核态的时间时减少。
    • 用途:通常用于统计进程的用户态和内核态运行时间,例如性能分析、资源消耗分析等。

这些定时器类型可以根据不同的需求选择合适的类型来实现相应的功能。例如,如果需要实现一个需要在特定时间间隔内执行的任务,可以选择使用 ITIMER_REAL 定时器;如果需要统计进程在用户态的运行时间,可以选择使用 ITIMER_VIRTUAL 定时器;如果需要统计进程在用户态和内核态的总运行时间,可以选择使用 ITIMER_PROF 定时器。

  • new_value:指向 struct itimerval 结构体的指针,用于设置新的定时器值。

  • old_value:可选参数,指向 struct itimerval 结构体的指针,用于获取之前的定时器值。

  • 返回值:

    • 如果成功,返回0;如果失败,返回-1,并设置 errno 错误码。

二、getitimer() 函数

  • 函数原型:

    int getitimer(int which, struct itimerval *curr_value);
    
  • 参数:

    • which:指定要获取的定时器类型,可以是 ITIMER_REALITIMER_VIRTUALITIMER_PROF
    • curr_value:指向 struct itimerval 结构体的指针,用于存储当前定时器的值。
  • 返回值:

    • 如果成功,返回0;如果失败,返回-1,并设置 errno 错误码。

三、示例代码

下面是一个简单的示例代码,演示了如何使用 setitimer() 设置一个定时器,并使用 getitimer() 获取当前定时器的值:

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>void timer_handler(int signum) {printf("Timer expired!\n");
}int main() {struct itimerval timer;signal(SIGALRM, timer_handler); // 设置定时器到期时的信号处理函数// 设置定时器的初始值和间隔值timer.it_value.tv_sec = 5; // 第一次定时器到期时间为5秒后timer.it_value.tv_usec = 0;timer.it_interval.tv_sec = 1; // 后续定时器每次到期时间间隔为1秒timer.it_interval.tv_usec = 0;// 设置定时器if (setitimer(ITIMER_REAL, &timer, NULL) == -1) {perror("setitimer");return -1;}// 获取并打印当前定时器的值struct itimerval current_timer;if (getitimer(ITIMER_REAL, &current_timer) == -1) {perror("getitimer");return -1;}printf("Current timer: %ld seconds %ld microseconds\n", current_timer.it_value.tv_sec, current_timer.it_value.tv_usec);// 主进程持续运行,等待定时器信号while (1) {sleep(1);}return 0;
}

在这里插入图片描述

这个示例代码首先设置了一个定时器,每隔1秒钟触发一次 SIGALRM 信号。然后使用 getitimer() 函数获取当前定时器的值,并打印出来。最后,程序进入一个无限循环,等待定时器信号的触发。


总结

setitimer() 函数允许我们设置一个定时器,该定时器可以在一定的时间间隔内周期性地触发信号。通过这个函数,我们可以灵活地控制定时器的起始值、间隔值等参数,从而实现不同的定时功能。同时,getitimer() 函数可以用来获取定时器的当前值,帮助我们实时监测定时器的状态。

这两个函数在Linux编程中被广泛应用于实现定时任务、网络超时处理、定时检测等功能。它们为程序员提供了一个方便而强大的工具,使得定时器相关功能的实现变得更加简单高效。通过合理地利用这两个函数,我们可以为我们的程序增加更多的实用性和可靠性。

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

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

相关文章

[华为OD]C卷 给定一个数组,数组中的每个元素代表该位置的海拔高度 山脉的个数 200

题目&#xff1a; 给定一个数组&#xff0c;数组中的每个元素代表该位置的海拔高度。0表示平地&#xff0c;&#xff1e;1时表示属于某个 山峰&#xff0c;山峰的定义为当某个位置的左右海拔均小于自己的海拔时&#xff0c;该位置为山峰。数组起始位 置计算时可只满足一边…

SpringBoot自定义定时任务

通常&#xff0c;在我们的项目中需要定时给前台发送一些提示性消息或者我们想要的定时信息&#xff0c;这个时候就需要使用定时任务来实现这一功能&#xff0c;实现也很简单&#xff0c;接下来具体来看看吧~ 简单定时任务 首先&#xff0c;你需要在你的启动类上加上开启定时任…

YOLOv5改进之bifpn

目录 一、原理 二、代码 三、在YOLOv5中的应用 一、原理 论文链接:

[Linux][网络][TCP][一][TCP基础][TCP报头]详细讲解

目录 1.TCP头部格式2.TCP协议的特点3.TCP如何封装与分用4.通过序列号和确认应答号提高可靠性1.32位序列号2.32位确认应答号3.保证可靠性4.为什么序列号和确认应答号是单独的字段 5.窗口大小1.TCP的发送和接收缓冲区2.窗口大小 6.连接管理机制 1.TCP头部格式 TCP全称为"传输…

Ubuntu20安装torch1.13和pytorch_geometric2.3.0(对应cuda11.6)

在torch下载页面搜索1.13https://pytorch.org/get-started/previous-versions/&#xff0c;wheel安装方式&#xff08;激活conda虚拟环境&#xff09; pip install torch1.13.0cu116 torchvision0.14.0cu116 torchaudio0.13.0 --extra-index-url https://download.pytorch.org…

【Trick】conda安装python依赖时出现429 Client Error

起因 我在根据yml文件安装依赖和创建虚拟环境时&#xff0c;出现报错&#xff0c;主要报错信息为以下两点&#xff1a; 【1】Collecting package metadata (repodata.json): failed 【2】requests.exceptions.HTTPError: 429 Client Error: Too Many Requests for url: https…

C++笔记打卡第25天(机房预约系统)

1.机房预约系统需求 1.1 系统简介 学校有几个规格不同的机房&#xff0c;使用时经常会出现重复现象&#xff0c;现开发一套机房预约系统&#xff0c;解决这一问题。 1.2 身份简介 分别有三种身份使用该程序&#xff1a; 学生代表&#xff1a;申请试用机房教师&#xff1a;…

深入理解网络原理3----TCP核心特性介绍(上)【面试高频考点】

文章目录 前言TCP协议段格式一、确认应答【保证可靠性传输的机制】二、超时重传【保证可靠性传输的机制】三、连接管理机制【保证可靠性传输的机制】3.1建立连接&#xff08;TCP三次握手&#xff09;---经典面试题3.2断开连接&#xff08;四次挥手&#xff09;3.3TCP状态转换 四…

车载电子电器架构 —— 如何理解和使用Update bit

车载电子电器架构 —— 如何理解和使用Update bit 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不…

RabbitMQ(Docker 单机部署)

序言 本文给大家介绍如何使用 Docker 单机部署 RabbitMQ 并与 SpringBoot 整合使用。 一、部署流程 拉取镜像 docker pull rabbitmq:3-management镜像拉取成功之后使用下面命令启动 rabbitmq 容器 docker run \# 指定用户名-e RABBITMQ_DEFAULT_USERusername \# 指定密码-e R…

C++学习--点滴记录011

11函数提高 11.1 函数默认参数 在C中&#xff0c;函数的形参列表中的形参可以有默认值 语法&#xff1a; 返回值类型 函数名 &#xff08;参数 默认值&#xff09;{} 示例&#xff1a; #include <iostream> using namespace std;int func(int a, int b 10, int c …

IoTDB 入门教程 基础篇③——基于Linux系统快速安装启动和上手

文章目录 一、前文二、下载三、解压四、上传五、启动六、执行七、停止八、参考 一、前文 IoTDB入门教程——导读 二、下载 下载二进制可运行程序&#xff1a;https://dlcdn.apache.org/iotdb/1.3.1/apache-iotdb-1.3.1-all-bin.zip 历史版本下载&#xff1a;https://archive.…

springboot 集成 flowable

随着企业对于业务流程管理需求的增加&#xff0c;流程引擎在企业信息化建设中的作用越来越重要。Flowable是一个开源的轻量级业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;它支持BPMN 2.0标准。 Flowable的一些特点&#xff1a; 安装集成&#xff1a;Flow…

每日一题(AL001):A+B Format--字符串处理

找输出的顺序很重要&#xff1a; #include<bits/stdc.h> using namespace std; int main(){int a,b;cin>>a>>b;int sumab;if(sum0) cout<<0;bool ftrue;vector<char> v;if(sum<0) {ffalse; sum-sum;}while(sum>0){char cstatic_cast<c…

Redis之Stream流

reidis为了抢占市场份额&#xff0c;推出了自己的消息队列&#xff0c;Stream流&#xff0c; 常用操作如下&#xff1a; xadd name id值 key value key1 value1...&#xff1a;若不存在为name的stream流&#xff0c;则创建一个新的名为name的stream流。这里id相当于数据库中的…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段&#xff1a; 1. 概论 自动驾驶系统的认知中有一些模糊的地方&#xff0c;比如自动驾驶系统如何定义的问题&#xff0c;自动驾驶的研发为什么会有那么多的子模块&#xff0c;怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍&#xff0c;了解自动驾…

R语言中,查看经安装的包,查看已经加载的包,查看特定包是否已经安装,安装包,更新包,卸载包

创建于&#xff1a;2024.5.4 R语言中&#xff0c;查看经安装的包&#xff0c;查看已经加载的包&#xff0c;查看特定包是否已经安装&#xff0c;安装包&#xff0c;更新包&#xff0c;卸载包 文章目录 1. 查看经安装的包2. 查看已经加载的包3. 查看特定包是否已经安装4. 安装包…

【netty系列-03】深入理解NIO的基本原理和底层实现(详解)

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

B树与B+树

B树定义 每个节点最多有m-1个关键字&#xff08;可以存有的键值对&#xff0c;m表示树的高度&#xff09;根节点最少可以只有1个关键字非根节点至少有m/2个关键字每个节点中的关键字都按照从小到大的顺序排列&#xff0c;每个关键字的左子树中的所有关键字都小于它&#xff0c…

如何将 redis 快速部署为 docker 容器?

部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式&#xff0c;特别适合开发、测试和部署环境。本文将详细介绍如何将 Redis 部署为 Docker 容器&#xff0c;包括 Docker 安装、Redis 容器配置、数据持久化、网络设置等方面。 步骤 1&#xff1a;安装 Docker 首…