usec,C语言打印毫秒

1,C语言打印毫秒当然有两位也有位?。?毫秒以1000为计数单位,89和170都有可能出现你如果要始终显示三位的话,你的格式化通配符%d要改成%03d,这样的话就可以打印出00:07:29.089 ==========================1000毫秒等于1秒啊 , 当然可以出现89和170啊
2,Linux下怎么编程设置时间tv_usec是一个long int数据类型,代表的是微秒(百万分之一秒)精度 。通过使用gettimeofday来获取系统时间 , 如下所示:#include #include #include int gettimeofday(struct timeval *tv, struct timezone *tz); int main(int argc,char * argv[]) {struct timeval tv;while(1) {gettimeofday(&tv,0);printf("time %u:%u\n",tv.tv_sec,tv.tv_usec);sleep(2);}return 0; }
3 , PHP问题listusec secexplodemicrotime问把时间戳和微秒分别存入到$sec和$usec中.microtime()//microtime() 当前 Unix 时间戳以及微秒数,本函数以 "msec sec" 的格式返回一个字符串.explode(" ", microtime());//按空格把微秒数和时间戳拆开成一个数组,因为microtime()返回的字符串是以空格为分隔符.explode(" ", microtime());//得到的是一个类似Array ( [0] => 0.57812900 [1] => 1286935327 ) 的数组list($usec, $sec) //list — 把数组中的值赋给一些变量 ,按数组下标顺序赋值. 得到类似:$usec = 0.57812900;$sec = 1286935327;搜一下:PHP问题-list($usec, $sec) = explode(" ", microtime());【usec,C语言打印毫秒】
4,C语言 验证时间戳有,时间戳一般是一个毫秒值 。有系统函数可以获取 。具体是啥记不清了linux下面有用从1970年至今的秒数来表示当前时间的我觉得windows应该也会有 你得到信息时间用当前时间减去这个时间得到的秒数 大于你超时的定义秒数就可以判定为超时啊使用time_t time( time_t * timer ) 精确到秒#include "time.h"void main ()time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( "\007the current date/time is: %s", asctime (timeinfo) );exit(0);}用gettimeofday();函数就可以;5 , gettimeofday和timetime(); 当前时间的UNIX时间戳,也就是从有UNIX开始到现在的秒数 。gettimeofday(); 内置函数生成的数组, 你再$timeEnd = gettimeofday(); 下面加上 print_r($timeEnd); exit; 看看这个数组里都有些什么. "sec" - 自 Unix 纪元起的秒数 "usec" - 微秒数 "minuteswest" - 格林威治向西的分钟数 "dsttime" - 夏令时修正的类型兄弟,要多看手册呀~unix及linux的时间系统是由「新纪元时间」epoch开始计算起,单位为秒 。epoch是指定为1970年1月1日凌晨零点零分零秒,格林威治时间 。目前大部份的unix系统都是用32位来记录时间,正值表示为1970以后,负值则表示1970年以前 。下面看下time.h中的time函数,sys/time.h中的gettimeofday函数#include<time.h>#include<sys/time.h>#include<stdio.h>int main()time_t tt;struct timeval tv;tt=time(null);gettimeofday(&tv,null);printf("time_t sec is %d\n",tt);printf("gettimeofday tv_sec is %d, usec is %d \n",tv.tv_sec,tv.tv_usec);}ps: time 与 gettimeofday 两个函数得到的都是从epoch开始到当前的秒数(tt=tv.tv_sec) , 而后者还能得到更精细的微秒级结果,即tv_sec*(10^6)+tv_usec为从epoch开始到当前的微秒数6,socket缓冲区是什么socket缓冲区,是指你在进行socket通信的时候,收发命令时的一个中间存放命令的存储空间,一般系统设置为8k,可以自己调整大小由于socket是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,也能保证对方一次性发送的数据能在同一刻接收到,所以receive方法是这么工作的:接受一个byye[]类型的参数作为缓冲区,在经过一定的时间后把接收到的数据填充到这个缓冲区里面,并且返回实际接收到数据的长度,这个实际接收到的数据长度有可能为0(没有接收到数据)、大于0小于缓冲区的长度(接收到数据,但是没有我们预期的多)、等于缓冲区的长度(说明接收到的数据大于等于我们预期的长度) 。每次接收缓冲区都用同一个byte[] bytemessage,并且你没有检查接收到的数据长度 , 所以第一次你接收到的数据是123456,第二次你只接收到了8 , 但是缓冲区里面还有23456,所以加起来就是823456了 。socket接收缓冲区的大小有讲究,设置大了接收起来慢,因为它要等尽可能多的数据接收到了再返回;设置小了需要重复多次调用接收方法才能把数据接收完,socket有个属性,标识了系统默认的接收缓冲区大小 , 可以参考这个!还有就是用recv读取,但是由于不知道缓存里有多少数据,如果是阻塞模式,到最后必然等到超时才知道数据已经读取完毕 , 这是个问题 。另一个是用fgetc,通过返回判断是否是feof:whlie (1)b=fgetc(f);if (feof(f)) break;//…}当然,我不知道读取完毕后最后一次调用fgetc会不会堵塞,需要测试 。在非阻塞模式下,我们用recv就可以轻松搞定了 , 但是阻塞模式下,由于我们不知道缓冲区有多少数据 , 不能直接调用recv尝试清除 。使用一个小小的技巧,利用select函数,我们可以轻松搞定这个问题:select函数用于监视一个文件描述符集合,如果集合中的描述符没有变化,则一直阻塞在这里 , 直到超时时间到达;在超时时间内,一旦某个描述符触发了你所关心的事件 , select立即返回,通过检索文件描述符集合处理相应事件;select函数出错则返回小于零的值,如果有事件触发,则返回触发事件的描述符个数;如果超时 , 返回0,即没有数据可读 。重点在于:我们可以用select的超时特性 , 将超时时间设置为0,通过检测select的返回值,就可以判断缓冲是否被清空 。通过这个技巧,使一个阻塞的socket成了非阻塞socket.现在就可以得出解决方案了:使用select函数来监视要清空的socket描述符,并把超时时间设置为0,每次读取一个字节然后丢弃(或者按照业务需要进行处理 , 随你便了),一旦select返回0 , 说明缓冲区没数据了(“超时”了) 。struct timeval tmout;tmout.tv_sec = 0;tmout.tv_usec = 0;fd_set fds;fd_zeros(&fds);fd_set(skt, &fds);int nret;char tmp[2];memset(tmp,0,sizeof(tmp));while(1)这种方式的好处是,不再需要用recv、recvfrom等阻塞函数直接去读?。?而是使用select,利用其超时特性检测缓冲区是否为空来判断是否有数据,有数据时才调用recv进行清除 。有人说同样可以用recv和socket的超时设置去清空?。飧雒淮恚?但是你需要直接对socket描述符设置超时时间,而为了清空数据而直接修改socket描述符的属性 , 可能会影响到其他地方的使用,造成系统奇奇怪怪的问题,所以,不推荐使用 。

    推荐阅读