Linux内核中获取时间函数do_gettimeofday_#include <linux/time.h>-程序员宅基地

技术标签: linux基础和实践  

内核代码能一直获取一个当前时间的表示, 通过查看 jifies 的值. 常常地, 这个值只代表从最后一次启动以来的时间, 这个事实对驱动来说无关, 因为它的生命周期受限于系统的 uptime. 如所示, 驱动可以使用 jiffies 的当前值来计算事件之间的时间间隔(例如, 在输入驱动中从单击中区分双击或者计算超时). 简单地讲, 查看 jiffies 几乎一直是足够的, 当你需要测量时间间隔. 如果你需要对短时间流失的非常精确的测量, 处理器特定的寄存器来帮忙了( 尽管它们带来严重的移植性问题 ).

     它是非常不可能一个驱动会需要知道墙上时钟时间, 以月, 天, 和小时来表达的; 这个信息常常只对用户程序需要, 例如 cron 和 syslogd. 处理真实世界的时间常常最好留给用户空间, 那里的 C 库提供了更好的支持; 另外, 这样的代码常常太策略相关以至于不属于内核. 有一个内核函数转变一个墙上时钟时间到一个 jiffies 值, 但是:

#include <linux/time.h> 

unsigned long mktime (unsigned int year, unsigned int mon, unsigned int day, unsigned int hour, unsigned int min, unsigned int sec);

    重复:直接在驱动中处理墙上时钟时间往往是一个在实现策略的信号, 并且应当因此而被置疑.

    虽然你不会一定处理人可读的时间表示, 有时你需要甚至在内核空间中处理绝对时间. 为此, <linux/time.h> 输出了 do_gettimeofday 函数. 当被调用时, 它填充一个 struct timeval 指针 -- 和在 gettimeofday 系统调用中使用的相同 -- 使用类似的秒和毫秒值. do_gettimeofday 的原型是:

    #include <linux/time.h> 

    void do_gettimeofday(struct timeval *tv);

    这段源代码声明 do_gettimeofday 有" 接近毫秒的精度", 因为它询问时间硬件当前 jiffy 多大比例已经流失. 这个精度每个体系都不同, 但是, 因为它依赖实际使用中的硬件机制. 例如, 一些 m68knommu 处理器, Sun3 系统, 和其他 m68k 系统不能提供大于 jiffy 的精度. Pentium 系统, 另一方面, 提供了非常快速和精确的小于嘀哒的测量, 通过读取本章前面描述的时戳计数器.
    当前时间也可用( 尽管使用 jiffy 的粒度 )来自 xtime 变量, 一个 struct timespec 值. 不鼓励这个变量的直接使用, 因为难以原子地同时存取这 2 个字段. 因此, 内核提供了实用函数 current_kernel_time:

#include <linux/time.h> 

struct timespec current_kernel_time(void);

用来以各种方式获取当前时间的代码, 可以从由 O' Reilly 提供的 FTP 网站上的源码文件的 jit ("just in time") 模块获得. jit 创建了一个文件称为 /proc/currentime, 当读取时, 它以 ASCII 码返回下列项:
当前的 jiffies 和 jiffies_64 值, 以 16 进制数的形式.
如同 do_gettimeofday 返回的相同的当前时间.
由 current_kernel_time 返回的 timespec.
我们选择使用一个动态的 /proc 文件来保持样板代码为最小 -- 它不值得创建一整个设备只是返回一点儿文本信息.
这个文件连续返回文本行只要这个模块加载着; 每次 read 系统调用收集和返回一套数据, 为更好阅读而组织为 2 行. 无论何时你在少于一个时钟嘀哒内读多个数据集, 你将看到 do_gettimeofday 之间的差别, 它询问硬件, 并且其他值仅在时钟嘀哒时被更新.
1、使用rtc设备,这个时钟可以用于各种模式 
2、借鉴系统调用adjtimex 
这里使用第二种方式
系统调用adjtimex
一直跟下去,会发现最后调用 
void do_gettimeofday(struct timeval *tv)
那么直接使用do_gettimeofday,能够得到struct timeval
struct timeval { 
time_t tv_sec; /* seconds */ 
suseconds_t tv_usec; /* microseconds */ 
};
那么就需要将这个tv_sec,即1970年开始至今的秒数转换为年月日时分秒 
其实内核已经有这样的函数 
/* 
* Convert seconds since 01-01-1970 00:00:00 to Gregorian date. 
*/ 
void rtc_time_to_tm(unsigned long time, struct rtc_time *tm)
唯一的不足是转换得到的是UTC时间,同北京时间差8小时。要想达到用户态localtime()的效果,必须获得/etc/localtime 中的时区信息。
示例代码:
#include <linux/timer.h> 
#include <linux/timex.h> 
#include <linux/rtc.h>
/*添加到合适位置*/
struct timex  txc; 
struct rtc_time tm; 
do_gettimeofday(&(txc.time)); 
rtc_time_to_tm(txc.time.tv_sec,&tm); 
printk(“UTC time :%d-%d-%d %d:%d:%d /n”,tm.tm_year+1900,tm.tm_mon, tm.tm_mday,tm.tm_hour,tm.tm_min,tm.tm_sec);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sheji105/article/details/78216939

智能推荐

Java+springboot+MYSQL牙科诊所预约系统75174-计算机毕业设计项目选题推荐(赠源码)-程序员宅基地

文章浏览阅读485次,点赞13次,收藏9次。本智慧综合管理是针对目前牙科诊所预约系统的实际需求,从实际工作出发,对过去的牙科诊所预约系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用目前最流行的B/S结构、java技术MySQL数据库设计并实现的。本牙科诊所预约系统主要包括登录模块的实现、系统模块、管理员模块、医生模块、用户模块等多个模块。它帮助牙科诊所预约系统实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了网络数据资源,有效的减少了牙科诊所预约系统的经济投入

【pandas】踩了merge操作的一个坑_file "pandas/_libs/join.pyx", line 104, in pandas.-程序员宅基地

文章浏览阅读5.2k次。最近一个上线半年的爬虫挂了,错误信息如题,挂在了一个dataframe的merge操作上。仔细看了看源代码,这个merge操作非常简单,目的只是想看两个数据集中date(%Y-%m-%d %H-%M-%S)交集,然后再决定下一步的操作。首先怀疑数据量随着时间推移变得很大,得分块操作了。但是查了一下当下的数据量,两个dataframe都只有几十万行,数据量并不是很大,反而Jenkins serve..._file "pandas/_libs/join.pyx", line 104, in pandas._libs.join.left_outer_join memoryerror

java代码在图片上画框_java ffmpage图片 画框-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏8次。有时候对于一些截图需要通过画框重点显示,用java代码在图片上画框的代码如下:package imagetest;import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileInputSt_java ffmpage图片 画框

android建ftp服务器,Android 快速搭建FTP服务器的方法-程序员宅基地

文章浏览阅读2.2k次。一、概述打开你的手机,找到文件管理->分类->远程管理,点击启动服务,这样大家可以在局域网内使用电脑访问你手机上的文件了,当然你也可以设置账号和密码,防止“小人”共享你手机上的资源-.-,那如果自己动手,该如何实现这个小功能呢?二、实现1、导入相关的jar包,并在build.gradle添加相应的依赖,如图。2.创建服务配置文件在values文件夹下新建的xml文件,方便在代码中的引用..._android ftp 服务器

探索Awesome ML Demos with iOS:让机器学习触手可及-程序员宅基地

文章浏览阅读389次,点赞3次,收藏6次。探索Awesome ML Demos with iOS:让机器学习触手可及项目地址:https://gitcode.com/tucan9389/awesome-ml-demos-with-ios在这个数字化的时代,机器学习(ML)已经成为了软件开发的重要组成部分,尤其在移动应用中。Awesome ML Demos with iOS 是一个精心策划的GitHub项目,它汇集了众多以iOS平台为基...

biubiubiu坐地铁 期望dp_n个座位地铁坐下人数的期望值-程序员宅基地

文章浏览阅读1.2k次。链接:https://ac.nowcoder.com/acm/contest/642/M来源:牛客网题目描述BiuBiuBiu 每次出去玩都要去坐地铁,BiuBiuBiu 观察到,当地铁上人比较少的时候,大家都会选择那些与其他人不相邻的座位,现在地铁上有 n 个座位排成一排,1 号座位与 2 号相邻,n 号座位与 n-1 号相邻,除了 1 号与 n 号座位,任意 i 号座位都与 i-..._n个座位地铁坐下人数的期望值

随便推点

服务器响应为 5.7.1,执行发送邮件Send方法时,报错:邮箱不可用。 服务器响应为: 5.7.1 Unable to relay for [email protected]程序员宅基地

文章浏览阅读612次。php常用方法总结/** * created by Tina * time 2015-1-6 10:31 * textarea中传入字符串的处理,返回数组,传入的字符串以换行分割; * 拆分,压缩空格,去除空值,去重复 ...bzoj 1097 &lbrack;POI2007&rsqb;旅游景点atr(最短路,状压DP)[题意] 给定一个n点m边的无向图,要求1开始n结束而且顺序经..._事务失败 服务器响应为5.7.1

Android Studio快捷键以及导入Eclipse项目_寻求升级帮助,emu i com斜杠emot,ion do w-程序员宅基地

文章浏览阅读508次。Android Studio常用快捷键1. Ctrl+D: 集合了复制和粘贴两个操作,如果有选中的部分就复制选中的部分,并在选中部分的后面粘贴出来,如果没有选中的部分,就复制光标所在的行,并在此行的下面粘贴出来。2. Ctrl+空格: 输入代码时按此组合键会列出与之相匹配的类、方法名、成员变量等,起智能提示的作用。在编辑XML文件一样有用。3. Ctrl+向下箭头 或Ctr_寻求升级帮助,emu i com斜杠emot,ion do w

区块链共识算法综述论文阅读笔记:A Review on Consensus Algorithm of Blockchain_区块链共识算法论文-程序员宅基地

文章浏览阅读397次。本文是区块链共识算法的综述论文“A Review on Consensus Algorithm of Blockchain”的阅读笔记,论文对区块链的共识算法进行了全面的描述,但是受限于时代因素,里面的一些内容有一定错误或过时,例如PoS+PoW被分类为PoS、认为PoW具有无限的可扩展性等。_区块链共识算法论文

C#中[WebMethod]的用法,aspx、ashx、asmx-程序员宅基地

文章浏览阅读361次。在.net 3.5的情况下前台JQuery做Ajax的时候,服务器端(1)可以调用aspx.cs 中声明带有[WebMehtod]的public static 的方法(不需要自己手动添加web.config的配置)(2)可以调用 *.asmx (web服务) 里面加了[webmethod]的方法(不能写静态,写静态就调用不到了)需要在asmx里面 去掉 [System.Web.Scri..._asmx webmethod语法

Unity编辑器扩展: GUILayout、EditorGUILayout 控件整理_editorguilayout.popup-程序员宅基地

文章浏览阅读1.4w次,点赞15次,收藏76次。GUILayoutGUILayoutOption基本每个控件方法都有一个可选参数是GUILayoutOption[] Options 这是一个可以控制组件大小之类的选项,在GUILayout类中共有8个。GUILayout.Height()GUILayout.Width()GUILayout.MaxHeight()GUILayout..._editorguilayout.popup

Android学习--Fragment-程序员宅基地

文章浏览阅读874次。学习目标:提示:这里可以添加学习目标例如: 一周掌握 Java 入门知识学习内容:提示:这里可以添加要学的内容例如:搭建 Java 开发环境掌握 Java 基本语法掌握条件语句掌握循环语句学习时间:提示:这里可以添加计划学习的时间例如:周一至周五晚上 7 点—晚上9点周六上午 9 点-上午 11 点周日下午 3 点-下午 6 点学习产出:提示:这里统计学习计划的总量例如: 技术笔记 2 遍 CSDN 技术博客 3 篇 习的 vlog 视频 1

推荐文章

热门文章

相关标签