- 浏览: 1386367 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
aidd:
内核处理time_wait状态详解 -
ahtest:
赞一下~~
一个简单的ruby Metaprogram的例子 -
itiProCareer:
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 ...
ruby中的类变量与类实例变量 -
dear531:
还得补充一句,惊群了之后,数据打印显示,只有一个子线程继续接受 ...
linux已经不存在惊群现象 -
dear531:
我用select试验了,用的ubuntu12.10,内核3.5 ...
linux已经不存在惊群现象
在内核中有3个不同的时间:
Wall time(real time), Process time和Monotonic time.
Wall time,也就是rtc时钟。
Process time,进程执行的时间。
Monotonic time,也就是系统从boot后到当前的时间。
表示时间的数据结构:
其中第三个最好,因为他能精确到纳秒。
上面的所能表示的是秒,我们有时需要更直观的表示,因此就有下面的数据结构;
clock_getres这个函数得到不同时钟的精度,也就是时钟间隔:
我的amd的cpu下,输出结果是这样的:
其中4000250刚好是0.04秒,也就是说x86的架构的系统时钟频率为250hz。。
得到当前的时间的函数:
通过结果可以看出4个时钟的不同含义。比如CLOCK_REALTIME我们可以看到结果就是从1970年以来所经过的秒数。。
设置时间的函数和get差不多:
这里要注意,在大部分系统我们设置时钟,只能设置CLOCK_REALTIME。。
这里还有一个更高级的函数:
这个函数用来同步内核的时钟。具体的用法可以去看man。。
sleep的4个函数:
sleep和usleep区别不大,一个是秒,一个是毫秒而已。
nanosleep和他们的区别是它使用纳秒,并且他不是用信号来实现的,因此建议使用nanosleep,而不要使用sleep和usleep。
而最后一个函数我们可以选择所取的时钟。。
那啥,usleep/sleep可以用select来模拟,更准时
不过10毫秒以下的精度是达不到的
,恩,不过有了nanosleep的话就没必要用select了吧。。
Wall time(real time), Process time和Monotonic time.
Wall time,也就是rtc时钟。
Process time,进程执行的时间。
Monotonic time,也就是系统从boot后到当前的时间。
表示时间的数据结构:
typedef __timer_t timer_t; struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; struct timespec { __time_t tv_sec; /* Seconds. */ long int tv_nsec; /* Nanoseconds. */ };
其中第三个最好,因为他能精确到纳秒。
上面的所能表示的是秒,我们有时需要更直观的表示,因此就有下面的数据结构;
struct tm { int tm_sec; /* Seconds. [0-60] (1 leap second) */ int tm_min; /* Minutes. [0-59] */ int tm_hour; /* Hours. [0-23] */ int tm_mday; /* Day. [1-31] */ int tm_mon; /* Month. [0-11] */ int tm_year; /* Year - 1900. */ int tm_wday; /* Day of week. [0-6] */ int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /* DST. [-1/0/1]*/ #ifdef __USE_BSD long int tm_gmtoff; /* Seconds east of UTC. */ __const char *tm_zone; /* Timezone abbreviation. */ #else long int __tm_gmtoff; /* Seconds east of UTC. */ __const char *__tm_zone; /* Timezone abbreviation. */ #endif };
clock_getres这个函数得到不同时钟的精度,也就是时钟间隔:
int clock_getres(clockid_t clk_id, struct timespec *res);
#include <stdio.h> #include <time.h> int main() { clockid_t clocks[]= { CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, (clockid_t) -1, }; int i; for(i=0;clocks[i] != (clockid_t) -1;i++) { struct timespec res; int ret; ret = clock_getres(clocks[i],&res); if(ret) perror("clock_getres"); else printf("clock = [%d],sec = [%ld],nsec = [%ld]\n",clocks[i],res.tv_sec,res.tv_nsec); } return 1; }
我的amd的cpu下,输出结果是这样的:
clock = [0],sec = [0],nsec = [4000250] clock = [1],sec = [0],nsec = [4000250] clock = [2],sec = [0],nsec = [1] clock = [3],sec = [0],nsec = [1]
其中4000250刚好是0.04秒,也就是说x86的架构的系统时钟频率为250hz。。
得到当前的时间的函数:
extern time_t time (time_t *__timer) __THROW; int gettimeofday(struct timeval *tv, struct timezone *tz); int clock_gettime(clockid_t clk_id, struct timespec *tp);
#include <stdio.h> #include <time.h> int main() { clockid_t clocks[]= { CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, (clockid_t) -1, }; int i; for(i=0;clocks[i] != (clockid_t) -1;i++) { struct timespec res; int ret; ret = clock_gettime(clocks[i],&res); if(ret) perror("clock_getres"); else printf("clock = [%d],sec = [%ld],nsec = [%ld]\n",clocks[i],res.tv_sec,res.tv_nsec); } return 1; }
通过结果可以看出4个时钟的不同含义。比如CLOCK_REALTIME我们可以看到结果就是从1970年以来所经过的秒数。。
设置时间的函数和get差不多:
int stime(time_t *t); int settimeofday(const struct timeval *tv, const struct timezone *tz); int clock_settime(clockid_t clk_id, const struct timespec *tp);
这里要注意,在大部分系统我们设置时钟,只能设置CLOCK_REALTIME。。
这里还有一个更高级的函数:
#include <sys/timex.h> int adjtimex(struct timex *buf);
这个函数用来同步内核的时钟。具体的用法可以去看man。。
sleep的4个函数:
sleep usleep int nanosleep(const struct timespec *req, struct timespec *rem); long sys_clock_nanosleep (clockid_t which_clock, int flags, const struct timespec *rqtp, struct timespec *rmtp);
sleep和usleep区别不大,一个是秒,一个是毫秒而已。
nanosleep和他们的区别是它使用纳秒,并且他不是用信号来实现的,因此建议使用nanosleep,而不要使用sleep和usleep。
而最后一个函数我们可以选择所取的时钟。。
评论
3 楼
simohayha
2009-01-05
pselect也能支持到纳秒的说。。。不过貌似有些unix平台不支持它。。
2 楼
simohayha
2009-01-05
seen 写道
那啥,usleep/sleep可以用select来模拟,更准时
不过10毫秒以下的精度是达不到的
,恩,不过有了nanosleep的话就没必要用select了吧。。
1 楼
seen
2009-01-05
那啥,usleep/sleep可以用select来模拟,更准时
不过10毫秒以下的精度是达不到的
不过10毫秒以下的精度是达不到的
发表评论
-
gcc的几个自动优化
2009-11-10 00:44 5082我的gcc版本是4.4.1 先来看const和define以 ... -
gdb学习笔记(一)
2009-10-17 14:11 11662这里只是一个摘要。具体的细节还需要去看manual。 1 ... -
ydb的内存模型
2009-09-06 18:02 1901阿宝同学推荐了这个东 ... -
glibc中strlen的实现
2009-08-04 09:10 4479glibc中的strlen的实现主要的思想就是每次检测4个字节 ... -
libevent源码浅析(四)
2009-05-15 23:02 4379最近刚刚一个项目自己用libevent,因此这几天又把libe ... -
libevent源码浅析(三)
2009-03-17 00:08 4509这次我们来看libevent的信号的处理。 在libeven ... -
libevent源码浅析(二)
2009-02-22 00:11 4041我们来看下libevent的定时器的实现 在libevent ... -
libevent源码浅析(一)
2009-02-14 13:23 7347这里分析的是libevent-1.4.9。 PS:前面还看了 ... -
libev简单使用介绍
2008-12-30 09:52 11413更详细的用法请看他的 ... -
linux下的elf结构
2008-12-12 00:20 5134可以看到链接器和加载器看待elf是完全不同的,链接器看到 ... -
php的c扩展
2008-12-07 18:24 4528在php中最核心的一个数据结构就是这个: typedef u ... -
linux下的管理内存相关的函数
2008-11-27 00:56 4420malloc的实现,在linux下的实现是这样的,当所需 ... -
linux下的数据对齐
2008-11-25 12:15 3600数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系。当 ... -
linux下检测ip冲突
2008-11-16 20:18 8071原理其实很简单,那就是广播一个arp包,然后recv,如果没有 ... -
今天碰到的一个问题
2008-10-29 22:33 1221将位图用 bmptopnm 转成pcl6的打印语言,然后直接c ... -
ftruncate和msync
2008-10-23 22:10 3436int ftruncate(int fd, off_t le ... -
GUN C正则表达式
2008-09-25 23:47 6143最近项目中要处理文本,因此就用了gun的正则表达式,它是pos ... -
看代码看的头晕
2008-09-06 01:04 1814最近工作需要在看ghostscript的代码,看得我头晕眼花, ... -
[转帖]MISRA--作为工业标准的C编程规范
2008-08-21 13:19 2798本文档转贴自孟岩的blog ... -
代码大全读书笔记1
2008-04-26 19:16 3786这么好的书,觉得写点东西,记录一下比较好。 4.1选择编程语 ...
相关推荐
time(); 函数 函数原型: time_t time(time_t *timer) ... * 处理日期时间的函数都是以本函数的返回值为基础进行运算 * * 函数原型: * #include <time> * * time_t time(time_t *calptr); * * 返回
在linux下,我们可以通过自带的NTP(Network Time Protocol)协议通过网络使自己的系统保持精确的时间。 NTP是用来使系统和一个精确的时间源保持时间同步的协议。建议大家在自己管理的网络中建立至少一台时间服务器来...
Linux Kernel CPUFreq Proc处理器整数处理漏洞.pdf
主要介绍了Linux下connect超时处理(总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...
我们可以把实时系统分为两类,一类是硬实时(Hard Real-Time) ;另外一类则是软实时(Soft Real-Time) 。 所谓硬实时是指如果系统对某个实时任务的处理未能在某 个截止时间开始或者结束的话,最终的结果将是灾难...
Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...
tcpdump [ -DenNqvX ] [ ...可以同时配合"-G time"选项使得输出文件每time秒就自动切换到另一个文件。可通过"-r"选项载入这些文件以进行分析和打印。 -r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取。
几乎所有的GNU/Linux程序都遵循一些同样的命令行解释习惯,程序的参数通常 分为了两大类:选项(option)或者一些标志(flag)、其他参数。选项(option)主要是提供给程序一些运行上的选择,而其他参数则通常是提 供给...
Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...
5熟悉在x86体系结构上Linux中断和异常的处理原理,中断注册、共享、控制,和中断上下文的意义,中断和设备驱动程序的关系,以及设备驱动程序结构和用户接口。(4小时) 6中断处理程序被分解为top half和bottom ...
深入理解Linux网络内幕(英文) If you've ever wondered how Linux carries out the complicated tasks assigned to it by the IP protocols -- or if you just want to learn about modern networking through ...
# > Created Time: 2018年04月15日 星期日 02时00分31秒 #************************************************************************/ 以压缩文件形式将二进制可执行文件添加到该脚本末尾 tar -zcvm SOFT_NAME >> ...
Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 TCP/IP四层模型 基本概念(对等通信、封装、分用、端口) 02TCPIP基础(二) 最大传输单元(MTU)/路径MTU 以太网帧格式 ICMP ARP RARP 03TCPIP基础...
1.6.2 Linux下访问DNS服务 1.6.3 使用tcpdump观察DNS通信过程 1.7 socket和TCPIP协议族的关系 第2章 IP协议详解 2.1 IP服务的特点 2.2 IPv4头部结构 2.2.1 IPv4头部结构 2.2.2 使用tcpdump观察IPv4...
采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. ...
一.Linux下的网络服务.......................................................................................................24 二.几种重要的配置文件......................................................
Linux tftp命令 ...verbose:显示详细的处理信息 trace:显示包路径 status:显示当前状态信息 binary:二进制传输模式 ascii:ascii 传送模式 rexmt:设置包传输的超时时间 timeout:设置重传的超时时间 h