小心 timeval 和 timespec 不小心溢出了

Linux C语言获取微秒级时间戳:gettimeofday函数详解与性能测量实践 在系统编程和性能优化中,时间戳是记录事件发生时刻、测量代码执行时间的基础工具。Linux系统提供了多种时间获取接口,其中gettimeofday函数因其微秒级精度和广泛兼容性,成为嵌入式开发、网络编程和性能分析中的常用选择。该函数通过返回自Unix纪元以来的秒数和微秒数,为开发者提供了精确的时间基准。理解其底层数据结构struct timeval和微秒字段tv_usec的有效范围,是避免常见精度陷阱的关键。在工程实践中,gettimeofday不仅用于生成带毫秒的日志时间戳,更是实现高精度耗时测量的核心。通 阅读详情
timeval 和 timespec 都是 POSIX 的秒以下时间类型,都是一个两个成员的结构,第一个成员是秒数,第二个成员则分别是微秒和纳秒。
之所以用这么个结构,是因为如果直接存储毫秒微秒或者纳秒,32位的整数根本放不下。
要说为什么不像 windows 下那样用 64 位的整数类型,我也觉得很好,但是十年前的编译器多数都没有提供 64 位的整数类型。
至于为什么有这两个用途差不多的时间类型,我也不知道。
 
前几天调试程序,发现带超时的等待偶尔会返回 EINVAL,也就是无效参数。
 
int GetResult(Result *result, const struct timeval *timeout)
{
    struct timespec abstime;
    struct timeval now;
    int ret = 0;
    pthread_mutex_lock(&mutex_);
    gettimeofday(&now, NULL);
    abstime.tv_sec = now.tv_sec + timeout->tv_sec;
    abstime.tv_nsec = 1000 * ();
    while (queue_.empty() && ret != ETIMEDOUT)
        ret = pthread_cond_timedwait(&cond_, &mutex_, &abstime);
    ...
}
问题在这里:当 now.tv_usec + timeout->tv_usec >= 1000000 时,abstime.tv_nsec 也就大于或者等于 10^9 了,直接传给 pthread_condwait 的时候,被认为是无效时间,直接返回 EINVAL 了。出错的概率等于传入的 timeout 中 tv_usec 折合的秒数。
这时候应该进位,秒数加一:
    if (abstime.tv_nsec >= BILLION)
    {
        ++abstime.tv_sec;
        ++abstime.tv_nsec %= BILLION;
    }
如果这样写,传入的 timeval 有问题也能修正,可以更安全一些,这时候应该修正还是报错,这是个哲学问题。
    const long BILLION = 1000000000;
    if (abstime.tv_nsec >= BILLION)
    {
        abstime.tv_sec += abstime.tv_nsec / BILLION;
        abstime.tv_nsec %= BILLION;
    }
此时的判断也可以去掉,如果传入的 timeout 的 tv_usec 比较小,则溢出的概率较低,加上这个判断可以减少后面的除法开销。总之这不再是bug,是个小问题了。
Linux C程序时间处理与时区配置实战指南 时间处理是计算机系统编程的基础,其核心在于将时间戳转换为人类可读的格式,并确保不同时区下的时间一致性。在Linux C编程中,这涉及到系统时钟、时区配置以及标准库函数的使用。正确处理时间对于日志记录、定时任务和数据同步等场景至关重要,能有效避免因时区不一致导致的线上事故。本文聚焦于Linux系统时区配置与C语言时间编程,深入解析了localtime_r、gmtime_r等线程安全函数的使用,并探讨了TZ环境变量在动态时区控制中的应用,帮助开发者构建健壮的全球化服务。 阅读详情

相关推荐

timespec结构体的概念和使用说明

timespec结构体的概念和使用说明

weixin_42108533的博客 1617

struct timespec详解

它包含了两个long类型的成员变量:tv_sec和tv_nsec。tv_sec表示自1970年1月1日00:00:00 UTC以来的秒数,tv_nsec表示tv_sec之后的纳秒数。上述代码片段中,我们通过将毫秒转换为秒和纳秒来设置ts结构体中的tv_sec和tv_nsec成员变量,然后传递给nanosleep函数实现睡眠。

qq_45949304的博客 5067

自动驾驶仿真 (四)—— 基于PreScan与Simulink的AEB系统多场景验证

本文详细介绍了基于PreScan与Simulink的AEB系统多场景验证方法,涵盖标准场景搭建、复杂工况扩展及控制策略优化。通过仿真技术,显著降低测试成本并提升场景覆盖率,有效解决实车测试中的痛点问题。特别适用于自动驾驶领域的AEB系统开发与验证。

weixin_28273593的博客 248

时间结构有struct timespec 和struct timeval

linuxlll

wince_lover的专栏 1万+

从透射谱到能量分布:用Rsoft破解光纤光栅耦合模式的3个关键技巧

本文面向光通信工程师与研究者,分享了利用Rsoft软件深入分析光纤光栅耦合模式的三个关键技巧。通过配置场监视器观察XY截面能量分布、利用传播动画追踪动态过程,并结合模式求解器精准判定相位匹配,帮助用户超越透射谱分析,直观可视化能量从纤芯到包层的耦合与流动,从而优化器件设计。

weixin_29290963的博客 421

基于Unidbg的小红书加密协议动态分析与算法还原实战

在移动应用安全领域,加密协议与签名机制是保障数据传输安全、实现客户端身份验证的核心技术。其原理通常涉及哈希算法、对称/非对称加密以及自定义的混淆逻辑,旨在防止请求被篡改或重放。理解这些协议对于安全研究、风控策略制定及合规的数据交互分析具有重要价值。在实际的工程实践中,面对高度混淆和加固的Native代码(SO库),传统的静态分析往往难以深入。此时,沙盒模拟执行技术提供了一种动态、可控的分析方案。通过搭建一个虚拟的移动应用运行环境,研究人员可以在无需真机、规避反调试机制的情况下,完整地追踪和观察加密算法的执行

weixin_29315091的博客 326

Linux(程序设计):20---时间处理(timespec、ctime、difftime、gmtime、clock_gettime、localtime、strftime、strptime)

格林尼治时间 所有的UNIX系统都使用同一个时间和日期的起点:格林尼治时间(GMT)1970年1月1 日午夜(0点)。这是“UNIX纪元的起点”,Linux也不例外。Linux系统中所有的时间都以从那时起经过的秒数来衡量 时间转换关系 TZ环境变量 在上图中,虚线表示的3个函数(localtime、mktime、strftime)受到环境变量TZ的影响 如果定义了TZ:则...

董哥的黑板报 3434

软硬件协同设计的大小端问题

缘起 最近需要在soc系统内做协处理器,加速AES加密运算,寄存器一次读取32bit,AES一次处理128bit,因此在数据拼接的时候,需要考虑大小端的问题,特来记录一番。 一、什么是大小端 大小端的问题发生在寄存器和内存间传递数据,这点非常重要,很多地方简单地说是数据存储方式,其实不准确。追根溯源,大小端问题是在设计load,store指令的时候考虑的,因此本质是寄存器和内存交互的问题,其他地方不会发生。 比如c语言里定义一个变量int a=ox1234,那么查看在线汇编平台的对应汇编代码: # 给2号寄

http://www.icfgblog.com/ 613

struct timespec 和 struct timeval

struct timespec 提供秒和纳秒级的时间精度 struct timeval 提供秒和微秒级的时间精度

思泽之思 1万+

振动分析中相位的确定

更是定位不平衡量角度的关键。是确定振动信号与转子旋转位置之间时间关系的核心步骤,而。以内,以确保校正配重安装角度的有效性。在实际动平衡中,相位角的误差需控制在。在振动分析和动平衡中,

轩辕霸天L 2735

电子技术——共栅和共源共栅放大器的高频响应

我们在之前学过无论是是CS放大器还是CE放大器,都可以看做是一个带通(IC低通)滤波器。在高频处的响应收到输入电容 $C_{in}$ 的限制(主要是米勒效应)。因此,若想扩大放大器的带宽,我们必须减小米勒效应,一种方案就是共栅放大器。

jiahonghao2002的博客 4183

Linux与Windows时间戳获取全解析:从系统调用到Qt跨平台实践

时间戳作为记录事件发生时刻的数字标识,在软件开发中扮演着核心角色。其原理基于从特定纪元(如Unix纪元)开始计算的时间单位累加,为日志记录、性能分析和数据同步提供统一的时间基准。在技术实现上,区分墙上时钟(如CLOCK_REALTIME)与单调时钟(如CLOCK_MONOTONIC)至关重要,前者反映日历时间但可能被调整,后者严格递增,专为耗时测量设计,这是确保时序逻辑正确的关键。对于跨平台开发,Linux通过clock_gettime系统调用提供灵活的高精度时间获取,而Windows则依赖QueryPer

weixin_33862993的博客 358

西门子工业物联网云平台 Insights Hub 技术白皮书

Insights Hub是西门子公司推出的工业物联网云平台,它是一个使用开放技术的基于云架构的平台,能够为制造业企业提供物联网连接、数据分析、应用开发等一系列服务。Insights Hub的设计理念是“连接、分析和运营”,即通过连接物理设备、收集数据并进行分析,来优化工业生产的运营和管理。

可爱的刘三岁的博客 3334

C语言时间处理全解析:从time()到clock_gettime()的高精度实践

时间处理是计算机系统编程的基础概念,其核心在于将物理时间转换为计算机可处理的数字表示。原理上,系统通过硬件时钟和操作系统维护的时间子系统,将时间量化为自特定纪元(如Unix Epoch)以来的计数单位。这一机制的技术价值在于为程序提供了感知和记录事件顺序、实现定时调度、进行性能分析的能力,是构建可靠、可观测系统的基石。应用场景广泛覆盖日志记录、任务调度、性能监控、分布式系统同步等领域。本文聚焦C语言环境,深入探讨如何通过标准库函数如`time()`和`localtime()`获取与转换时间,并进一步解析如何

weixin_34060741的博客 343

安卓讲课笔记1.1 安装Android Studio

1. 能安装配置Android Studio; 2. 能创建安卓虚拟机(AVD); 3. 能创建简单安卓应用

howard2005的专栏 3365

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux C时间编程:从time()到clock_gettime()的实战指南

在Linux系统编程中,时间处理是基础且关键的技术环节。其核心原理涉及系统时钟、时区转换和精度控制等多个层面。从技术价值看,正确的时间操作能确保日志记录、性能分析和分布式系统同步的准确性。应用场景广泛,包括日志系统、性能剖析工具和跨时区应用开发。本文聚焦Linux C编程中的时间获取,深入解析time()、localtime()和clock_gettime()等函数的使用技巧与陷阱,特别强调线程安全和单调时钟的重要性,帮助开发者避免常见错误,提升代码健壮性。

weixin_34080951的博客 446

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

c语言中:struct timespec

通常用于高精度的时间测量和操作,特别是在需要测量小时间间隔或在需要与硬件或实时系统进行交互的情况下。例如,在POSIX系统上,你可以使用这个结构体来表示具体的时间点或时间间隔,以及执行各种时间相关的操作,比如计算时间差、等待一定的时间等。是一个结构体,通常用于处理时间和时间间隔。),用于存储纳秒(nanoseconds)。它表示时间的小数部分,即纳秒数。它表示时间的整数部分,即秒数。结构来表示当前时间。

ALL BE WELL的博客 3701

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux tm time_t timeval timespec以及与时间相关函数用法

一、时间类型 linux中编程通常需要用到时间变量,和相关的时间操作函数。常用的时间类型有: time_t 、struct timeval、struct timespec、struct tm。 在用到相关的类型和函数时,需要加上头文件:#include <time.h> time_t: 存储从1970年到现在经过了多少秒。格式为long int。UTC时间。 str...

健忘16的博客 7118

系统时间struct timespec 与 struct timeval 的区别

1、精确级别:纳秒级别 struct timespec //精确到纳秒 { time_t tv_sec; //秒 long tv_nsec;//纳秒,1s = 1000ms(毫秒) = 1000*1000us(微妙) = 1000*1000*1000ns(纳秒) } 函数原型 long clock_gettime(clockid_t which_clock_id, str

xi_gua_gua的博客 1万+

linux timespec 链接库,Linux内核 timespec_sub()

函数:timespec_sub()函数timespec_sub()将两个timespec类型的变量作减法,结果保存在一个新的timespec类型的变量中。文件包含:函数定义:在内核源码中的位置:linux-3.19.3/include/linux/time.h函数定义格式:输入参数说明:此函数的参数都是struct timespec类型的结构体变量,定义见文件linux-3.19.3/includ...

weixin_28745309的博客 1115

c时间函数strftime、struct timespec 和 struct timeval

时间和日期 由UNIX内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time,UTC)公元1970年1月1日00:00:00这一特定 时间以来经过的秒数。1.10节中曾提及这种秒数是以数据类型time_t表示 的,我们称它们为日历时间。日历时间包括时间和日期。UNIX在这方 面与其他操作系统的区别是:(a)以协调统一时间而非本地时间计 时;(...

Escaping 1655

Linux时间相关知识小结:struct timeval、timespec、gettimeofday、time、localtime....

前言 我们在linux平台进行开发时,时间相关的操作基本上都会遇到,本文就对常用的时间相关的结构体、接口进行分析小结。 常见类型、结构体定义 timespec 原型 struct timespec { __time_t tv_sec; /* Seconds. 秒 */ __syscall_slong_t tv_nsec; /* Nanoseconds. 纳秒*/ }; 说明 该结构体只是包括秒和纳秒,并没有任何其他含义,比如1970年以来的秒数等。只是个存放空间。为clock_gettime的

猪哥的专栏 6068

Linux时间函数

系统环境:ubuntu10.04 简介 本文旨在为了解Linux各种时间类型与时间函数提供技术文档。 1、Linux下常用时间类型 Linux下常用时间类型有四种:time_t、struct tm、struct timeval、struct timespec 1.1 time_t时间类型 time_t类型在time.h中定义: [cpp] view p

lawliet_wy的专栏 579

Linux内核 timespec_add_ns()

该函数的第二个参数是一个64位的无符号整数,表示的是纳秒,与第一个参数的字段tv_nsec相加,结果大于999999999则向结构体的字段tv_sec进位。执行命令insmod timespec_add_ns.ko插入模块,然后输入命令dmesg -c查看系统输出信息,出现如图所示结果。函数实现timespec结构体变量与整数的相加,无符号整数表示的是纳秒数,结果保存在结构体变量中。在内核源码中的位置:linux-3.19.3/include/linux/time.h。

CodeAllen嵌入式 1427

timeval 与timespec

timeval   DESCRIPTION    The functions gettimeofday and settimeofday can get and set the time as    well as a timezone. The tv argument is atimevalstruct, as specified in :         structtimeval{

涛行无疆的专栏 1579
上一篇: 判断CPU是大端还是小端
下一篇: ARM流水线
flickedball
博客等级 码龄19年 12粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值