做传感器交易的网站/企业seo推广外包
声明
在 src\core\ngx_times.c 中:
static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec);
实现
在 src\core\ngx_times.c 中:
static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)struct timespec ts;#if defined(CLOCK_MONOTONIC_FAST)clock_gettime(CLOCK_MONOTONIC_FAST, &ts); #elseclock_gettime(CLOCK_MONOTONIC, &ts); #endifsec = ts.tv_sec;msec = ts.tv_nsec / 1000000;#endifreturn (ngx_msec_t) sec * 1000 + msec; }
通过 gcc -E 处理 预处理指令后
static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) {struct timespec ts;clock_gettime( # 204 "src/core/ngx_times.c" 3 41 # 204 "src/core/ngx_times.c", &ts);sec = ts.tv_sec;msec = ts.tv_nsec / 1000000;return (ngx_msec_t) sec * 1000 + msec; }
NGX_HAVE_CLOCK_MONOTONIC 宏
objs/ngx_auto_config.h:287:#define NGX_HAVE_CLOCK_MONOTONIC 1
在 objs/ngx_auto_config.h 中
#ifndef NGX_HAVE_CLOCK_MONOTONIC #define NGX_HAVE_CLOCK_MONOTONIC 1 #endif
NGX_HAVE_CLOCK_MONOTONIC
是一个宏定义,用于指示系统是否支持
clock_gettime()
函数的CLOCK_MONOTONIC
时钟源
CLOCK_MONOTONIC
是 POSIX 标准中定义的一种时钟类型,表示单调递增的时间。与
CLOCK_REALTIME
不同,CLOCK_MONOTONIC
的时间不会因为系统时间的调整(例如用户手动修改系统时间或通过 NTP 同步)而发生跳变。因此,它非常适合用于测量时间间隔或计算超时
NGX_HAVE_CLOCK_MONOTONIC
宏的作用是检查当前系统是否支持CLOCK_MONOTONIC
如果支持,Nginx 会使用
clock_gettime(CLOCK_MONOTONIC, ...)
来获取高精度的时间戳,从而实现更精确的时间管理在 Nginx 的构建过程中,通常会通过
configure
脚本来检测系统是否支持CLOCK_MONOTONIC
编译时,
configure
脚本会尝试编译一段测试代码,调用clock_gettime()
并传入CLOCK_MONOTONIC
参数。如果编译成功且运行正常,则说明系统支持
CLOCK_MONOTONIC
,此时会在生成的配置头文件(如objs/ngx_auto_config.h
)中定义NGX_HAVE_CLOCK_MONOTONIC
宏。如果编译失败或运行异常,则不会定义该宏
CLOCK_MONOTONIC_FAST 宏
未定义
CLOCK_MONOTONIC_FAST
用于替代标准的CLOCK_MONOTONIC
,在保证时间单调递增的前提下,减少时间获取的系统调用开销
- 在 FreeBSD 等类 Unix 系统中,
CLOCK_MONOTONIC_FAST
是系统原生支持的时钟类型(通过clock_gettime()
使用)。- 在 Linux 等不支持该时钟的系统上,Nginx 会通过宏定义将其回退到
CLOCK_MONOTONIC
,确保兼容性。
CLOCK_MONOTONIC
表示一种单调递增的时间源,从系统启动(即内核初始化完成)开始计时
- 不受系统时间调整的影响 :即使管理员手动修改了系统时间(例如通过
date
命令或 NTP 服务),CLOCK_MONOTONIC
的值也不会受到影响。- 单调递增 :该时钟只会随着时间向前推进,不会回退(除非系统重启)。
- 高分辨率 :通常提供纳秒级别的精度。
所以
clock_gettime(CLOCK_MONOTONIC, &ts);
成立
综上,在我的 Ubuntu 环境下运行的实际代码应该是:
static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) {struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);sec = ts.tv_sec;msec = ts.tv_nsec / 1000000;return (ngx_msec_t) sec * 1000 + msec; }
函数的目标是获取一个基于单调时间(monotonic time)的时间戳,以毫秒为单位返回。单调时间的特点是不会受到系统时间调整的影响,适合用于计时和超时检测等场景
定义一个
timespec
结构体变量ts
,用于存储通过clock_gettime
获取的时间信息
struct timespec
是 POSIX 标准中定义的时间结构体,包含两个字段:
tv_sec
:秒数部分。tv_nsec
:纳秒部分(1 秒 = 10^9 纳秒)。调用
clock_gettime
函数,获取当前的单调时间,并将结果存储到ts
中
CLOCK_MONOTONIC
是一种单调递增的时钟源,不会受到系统时间调整(如手动修改系统时间或 NTP 同步)的影响。
clock_gettime
是 POSIX 标准中的函数,用于获取高精度时间将
ts.tv_sec
(单调时间的秒数部分)赋值给函数参数sec
将
ts.tv_nsec
(纳秒部分)转换为毫秒,并赋值给函数参数msec
将秒数转换为毫秒,并加上毫秒部分,最终返回一个以毫秒为单位的时间戳
clock_gettime
函数
clock_gettime
是 POSIX 标准中定义的一个函数,用于获取高精度的时间信息。它能够从指定的时钟源(clock source)中读取当前时间,并以纳秒级精度返回结果。函数原型
#include <time.h>int clock_gettime(clockid_t clk_id, struct timespec *tp);
clk_id
:指定时钟源(clock source),决定了时间的来源。
常见的时钟源包括:
CLOCK_REALTIME
:系统实时时间(wall-clock time),可以被手动调整或通过 NTP 同步。
CLOCK_MONOTONIC
:单调递增的时间,从某个固定点开始计时,不受系统时间调整的影响。
CLOCK_PROCESS_CPUTIME_ID
:进程的 CPU 时间。
CLOCK_THREAD_CPUTIME_ID
:线程的 CPU 时间。
CLOCK_BOOTTIME
(Linux 特有):类似于CLOCK_MONOTONIC
,但包括系统休眠时间。选择不同的时钟源会影响时间的用途。
tp
:指向一个
struct timespec
结构体的指针,用于存储获取到的时间信息。返回值
- 成功时返回
0
。- 失败时返回
-1
,并设置errno
表示错误原因。
相关文章:

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_monotonic_time函数
声明 在 src\core\ngx_times.c 中: static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec); 实现 在 src\core\ngx_times.c 中: static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)st…...

业务开发 | 基础知识 | Maven 快速入门
Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念(POM),Maven 可以从中央信息中管理项目的构建,报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…...

基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程
以下是一个基于 Python(Flask)、JavaScript、HTML 和 CSS 实现前后端交互的详细开发过程: --- ### 一、技术选型 1. **后端**:Python Flask(轻量级Web框架) 2. **前端**:HTML/CSS JavaScript&…...

STM32 RCC功能说明 复位和时钟控制RCC
目录 背景 RCC配置时钟主要涉及两方面 程序 第1步、RCC默认初始化 第2步、等待HSE工作稳定 第3步、设置PLL时钟源以及倍频数 第4步、设置AHB总线时钟(HCLK) 第5步、设置PCLK1(APB1总线) 第6步、设置PCLK2(APB2总线) 第7步、FLASH存储器的配置 …...

Windows可以永久暂停更新了
最终效果图: 第一步: winR组合键打开运行对话框,输入“regedit”,点击“确定”或回车: 第二步: 注册表定位到“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”,新建DWO…...

高级 Python Web 开发:基于 FastAPI 构建高效实时聊天系统与并发控制
高级 Python Web 开发:基于 FastAPI 构建高效实时聊天系统与并发控制 目录 🌐 WebSocket 实时通讯概述💬 FastAPI 中实现 WebSocket 聊天系统🔧 WebSocket 并发控制与性能优化🔒 WebSocket 安全性与认证机制…...

深入理解Java虚拟机(JVM)
JVM概述 JVM作用 java虚拟机负责装载字节码到其内部,解释/编译为对应平台上的机器码指令执行,通俗说就是将字节码转换为机器码 JVM内部构造 1、类加载部分:负责把硬盘上的字节码加载到内存中(运行时数据区) 2、运…...

笔试面试——逻辑题
1.n从1开始,每个操作可以选择对n加1或者对n加倍,若想获得整数2014,最少需要多少个操作。 2.一个池塘,养龙虾若干,请想一个办法尽量准确的估算其中有多少龙虾? 3. S先生,P先生,Q先生他们知道桌子…...

【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)
本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…...

软考高级《系统架构设计师》知识点(一)
计算机硬件 校验码 码距:就单个编码A:00而言,其码距为1,因为其只需要改变一位就变成另一个编码。在两个编码中,从A码到B码转换所需要改变的位数称为码距,如A:00要转换为B:11,码距为2。一般来说,…...

用大模型学大模型01-制定学习计划
提示词:我想学习大模型,需要AI制定一个完整的学习计划,并给出学习路径和学习资料。以教科书目录的方式给出学习路线 第1章:数学与编程基础(4-6周) 1.1 数学基础 线性代数(矩阵运算、特征值分…...

lvs的DR模式
基于Linux的负载均衡集群软件 LVS 全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件 Nginx 支持四层和七层(应用层)负载均衡 HAProxy 和Nginx一样,也可同时支持四层和七层(应用层)负载均衡 基于Linux的高可用集群软件 Keepalived Keepalived是Linux…...

mysql读写分离与proxysql的结合
上一篇文章介绍了mysql如何设置成主从复制模式,而主从复制的目的,是为了读写分离。 读写分离,拿spring boot项目来说,可以有2种方式: 1)设置2个数据源,读和写分开使用 2)使用中间件…...

【C++学习篇】C++11第二期学习
目录 1. 可变参数模板 1.1 基本语法及原理 1.2 包扩展 1.3empalce系列接⼝ 2. lamba 2.1 lambda的语法表达式 2.2 捕捉列表 2.3 lamba的原理 1. 可变参数模板 1.1 基本语法及原理 1. C11⽀持可变参数模板,也就是说⽀持可变数量参数的函数模板和类模板&…...

TextWebSocketHandler 和 @ServerEndpoint 各自实现 WebSocket 服务器
TextWebSocketHandler 和 ServerEndpoint 都可以用于实现 WebSocket 服务器,但它们属于不同的技术栈,使用方式和功能有一些区别。以下是它们的对比: 1. 技术栈对比 特性TextWebSocketHandler (Spring)ServerEndpoint (Java EE/JSR-356)所属框…...

【C++高并发服务器WebServer】-18:事件处理模式与线程池
本文目录 一、事件处理模式1.1 Reactor模式1.2 Proactor模式1.3 同步IO模拟Proactor模式 二、线程池 一、事件处理模式 服务器程序通常需要处理三类事件:I/O事件、信号、定时事件。 对应的有两种高效的事件处理模式:Reactor和Proactor,同步…...

23种设计模式的定义和应用场景-02-结构型模式-C#代码
23种设计模式的定义和应用场景: 1. 创建型模式(共5种): 单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式…...

数据脱敏方案总结
什么是数据脱敏 数据脱敏的定义 数据脱敏百度百科中是这样定义的: 数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。这样就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集…...

自然语言处理NLP入门 -- 第二节预处理文本数据
在自然语言处理(NLP)中,数据的质量直接影响模型的表现。文本预处理的目标是清理和标准化文本数据,使其适合机器学习或深度学习模型处理。本章介绍几种常见的文本预处理方法,并通过 Python 代码进行示例。 2.1 文本清理…...

02.10 TCP之文件传输
1.思维导图 2.作业 服务器代码: #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> …...

基于STM32的ADS1230驱动例程
自己在练手项目中用到了ADS1230,根据芯片手册自写的驱动代码,已测可用,希望对将要用到ADS1230芯片的人有所帮助。 芯片:STM32系列任意芯片、ADS1230 环境:使用STM32CubeMX配置引脚、KEIL 部分电路: 代码…...

Bro想要玩github api
Bro想要在vscode 和 rest client插件的帮助下,修改我的github个人信息 ### 先安装REST client插件 ### 文件名test-github.http ### bro需要自己在github develop setting 获得token ### ref link: https://docs.github.com/en/authentication/keeping-your-accoun…...

idea插件开发,如何获取idea设置的系统语言
手打不易,如果转摘,请注明出处! 注明原文:https://zhangxiaofan.blog.csdn.net/article/details/145578160 版本要求 大于 2024.3 错误用法 网上有的说使用:UIUtil com.intellij.util.ui.UIUtil 代码示例…...

怎麼使用靜態住宅IP進行多社媒帳號管理
隨著社交媒體平臺的多樣化,很多人發現一個社媒帳號已經無法滿足需求。以下是幾個常見場景: 企業需求:企業可能需要在不同平臺上運營多個品牌帳號,為每個市場地區單獨設立帳號。個人需求:一些自由職業者或內容創作者可…...

InfiniBand与IP over InfiniBand(IPOIB):实现高性能网络通信的底层机制
在现代高性能计算(HPC)和数据中心环境中,网络通信的效率和性能至关重要。InfiniBand(IB)作为一种高性能的串行计算机总线架构,以其低延迟、高带宽和高可靠性而广泛应用于集群计算和数据中心。IP over InfiniBand(IPOIB)则是在InfiniBand网络上实现IP协议的一种方式,它…...

掌握 PHP 单例模式:构建更高效的应用
在 PHP 应用开发中,资源的高效管理至关重要。单例模式是一种能够帮助我们实现这一目标的设计模式。本文将深入探讨单例模式的概念、工作原理以及在 PHP 项目中何时应该(或不应该)使用它。 什么是单例模式? 单例模式是一种设计模…...

实现限制同一个账号最多只能在3个客户端(有电脑、手机等)登录(附关键源码)
如上图,我的百度网盘已登录设备列表,有一个手机,2个windows客户端。手机设备有型号、最后登录时间、IP等。windows客户端信息有最后登录时间、操作系统类型、IP地址等。这些具体是如何实现的?下面分别给出android APP中采集手机信…...

Python入门全攻略(四)
函数 初识函数 函数:封装具有某种功能的代码块。 函数定义 使用def关键字来定义函数 # 定义函数 def 函数名(): 代码块 # 调用函数 函数名() 函数参数 def 函数名(形参) 代码块 # 调用 函数名(实参) 位置参数 按参数顺序传参 def func(a, b): print(a b)…...

Ubuntu 22.04 - OpenLDAP安装使用(服务器+LAM+客户端)
csdn你…怎么不自动保存了很崩溃啊啊啊啊,我记得发现没保存之后我又改了一遍然后保存了,怎么现在又没了啊啊啊啊,过了这么久我都不记得了啊啊啊啊啊 参考 在 Ubuntu 22.04|20.04|18.04 上安装 OpenLDAP 和 phpLDAPadmin 在 Ubuntu 22.04|20…...

Linux ARM64 将内核虚拟地址转化为物理地址
文章目录 前言一、通用方案1.1 kern_addr_valid1.2 __pa 二、ARM64架构2.1 AT S1E1R2.2 is_kernel_addr_vaild2.3 va2pa_helper 三、demo演示参考资料 前言 本文介绍一种通用的将内核虚拟地址转化为物理地址的方案以及一种适用于ARM64 将内核虚拟地址转化为物理地址的方案&…...