1. linux usleep()与usleep_range()的区别是什么
usleep函数能把进程挂起一段时间, 单位是微秒(千分之一毫秒)。
头文件: unistd.h
语法:void usleep(int micro_seconds);
返回回值: 无
内容说明:本答函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的微秒数(us)。
2.这个延迟函数最少的延迟时间为50us, 就算min=max=1, 实际的效果应该不是延迟1us, 而是50us,看参数就能看出来这个函数是在一定范围内延迟,而不是准确的延迟。
usleep_range(unsigned long min, unsigned long max)
2. linux下,记录响应时间的脚本,精确到毫秒ms
执行前、执行后获取两次时间戳相减吧。
不过 Linux 貌似服务器版、普通桌面版的时钟精确度不是很高。
3. 如何用C语言得到精确到微秒
timeval这个struct当中可以精确到微秒。
LINUX中示例:
#include<stdio.h>//forprintf()
#include<sys/time.h>//forgettimeofday()
#include<unistd.h>//forsleep()
intmain()
{
structtimevalstart,end;
gettimeofday(&start,NULL);
printf("start:%d.%d ",start.tv_sec,start.tv_usec);
sleep(1);
gettimeofday(&end,NULL);
printf("end:%d.%d ",end.tv_sec,end.tv_usec);
return0;
}
运行回结果答:
start:1418118324.633128
end:1418118325.634616
4. 在linux下,想用sleep函数实现延时五秒,应该怎么设参数
使用权限 : 所有使用者
使用方式 : sleep [--help] [--version] number[smhd]
说明 : sleep 可以用来将目前动作延迟一段时间
参数说明 :
--help : 显示辅助讯息
--version : 显示版本编号
number : 时间长度,后面可接 s、m、h 或 d
其中 s 为秒,m 为 分钟,h 为小时,d 为日数
例子 :
显示目前时间后延迟 1 分钟,之后再次显示时间 :
date;sleep 1m;date
这个命令更多应用于shell脚本编程里和程序里
如下面的一段程序:
应用程序:
复制代码
代码如下:
#include <syswait.h>
usleep(n) //n微秒
Sleep(n)//n毫秒
sleep(n)//n秒
驱动程序:
#include <linux/delay.h>
mdelay(n) //milliseconds 其实现
#ifdef notdef
#define mdelay(n) (\
{unsigned long msec=(n); while (msec--) udelay(1000);})
#else
#define mdelay(n) (\
(__builtin_constant_p(n) && (n)<=MAX_UDELAY_MS) ? udelay((n)*1000) : \
({unsigned long msec=(n); while (msec--) udelay(1000);}))
#endif
调用asm/delay.h的udelay,udelay应该是纳秒级的延时
Dos:
sleep(1); //停留1秒
delay(100); //停留100毫秒
Windows:
Sleep(100); //停留100毫秒
Linux:
sleep(1); //停留1秒
usleep(1000); //停留1毫秒
每一个平台不太一样,最好自己定义一套跨平台的宏进行控制
秒还是微秒?关于延时函数sleep()
因为要写一段代码,需要用到sleep()函数,在我印象中,sleep(10)好像是休眠10微秒,结果却是休眠了10秒(在Linux下)。觉得很奇怪,因为头儿也记得好像是微秒为单位的。所以就查了一下。
原来linux下的sleep函数原型为:
unsigned int sleep(unsigned int seconds);
而MFC中的Sleep函数原型为:
void Sleep(DWORD dwMilliseconds);
也就是说,Linux下(使用的gcc的库),sleep()函数是以秒为单位的,sleep(1);就是休眠1秒。而MFC下的sleep()函数是以微秒为单位的,sleep(1000);才是休眠1秒。原来如此啊。而如果在Linux下也用微妙为单位休眠,可以使用线程休眠函数:void usleep(unsigned long usec);当然,使用的时候别忘记#include <system.h>哦。
另外值得一提的是,linux下还有个delay()函数,原型为extern void delay(unsigned int msec);它可以延时msec*4毫秒,也就是如果想延时一秒钟的话,可以这么用 delay(250);
5. Linux下C语言获得系统时间的方法
没有完整程序, 不过能提供一点资料
int gettimeofday(struct timeval * tv,struct timezone *tz);
这个函数可以获取当前时间, 貌似只要第一个结构体就行了
struct timeval
{
time_t tv_sec; //秒 [long int]
suseconds_t tv_usec; //微秒 [long int], (10E-6 second)
};
struct timeval
{
long tv_sec;
long tv_usec;
};
然后取微秒的前三位就是小数了, 之后把秒 tv_sec 转化为 tm 格式, 参数用秒的指针就行
struct tm * gmtime(const time_t * t);
//转换成格林威治时间。有时称为GMT或UTC。
struct tm * localtime(const time_t *t);
//转换成本地时间。它可以透过修改TZ环境变数来在一台机器中,不同使用者表示不同时间.
下面是tm的部分参数
int tm_sec; //tm_sec表「秒」数,在[0,61]之间,多出来的两秒是用来处理跳秒问题用的。/* Seconds: 0-59 (K&R says 0-61?) */
int tm_min; //tm_min表「分」数,在[0,59]之间。
int tm_hour; //tm_hour表「时」数,在[0,23]之间。
int tm_mday; //tm_mday表「本月第几日」,在[1,31]之间。
int tm_mon; //tm_mon表「本年第几月」,在[0,11]之间。
int tm_year; //tm_year要加1900表示那一年。 /* /* 年份,其值从1900开始 */*/
int tm_wday; //tm_wday表「本周第几日」,在[0,6]之间。 /* Days since Sunday (0-6) */ /*其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; //tm_yday表「本年第几日」,在[0,365]之间,闰年有366日。 /*其中0代表1月1日,1代表1月2日,以此类推 */*/
int tm_isdst; //tm_isdst表是否为「日光节约时间」
------------------------------华丽丽的分割线--------------------------------------------------
由于很长时间没编程了, 也没有Linux环境, 我就简单写几行代码, 仅作参考
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include<unistd.h>
//这四个不一定够用了
struct timeval tv;
struct timezone tz;
struct tm * p_tm;
//变量没有初始化习惯不好,不要学
gettimeofday(&tv, &tz);
p_tm = gmtime( (const time_t *)&tv.tv_sec );
字符串的组装尤其格式问题自己解决吧
年 p_tm->tm_year+ 1900
月 p_tm->tm_mon+ 1
日 p_tm->tm_mday
时 p_tm->tm_hour+ 1
分 p_tm->tm_min+ 1
秒 p_tm->tm_sec+ 1
小数点后面的部分,注意不够三位还是前面填充0 tv.tv_sec/1000
6. linux中的usleep是库函数吗
是C标准库中的函数,在libc库中实现。
使用前需包含unistd.h头文件,函数原型为
intusleep(useconds_tusec);
参数usec为微秒,取值范围[0,1000000]。
使用方法:
#include<unistd.h>
...
unsignedintusecs;
...
usleep(usecs);
7. linux 内核怎么打印系统时间戳
在编译Linux内核,配置时:make menuconfig ---> Kernel hacking --> show timing information on printks
当选中这个选项后,启动内核,会在日志信息前面加上时间戳。
从下面的输出可以看出,时间精确到微秒(us)。
如下:
-------------------------------------------------------------------------------------------
Uncompressing Linux... done, booting the kernel.
[ 0.000000] Linux version 2.6.35.7+ (bshen@bamboo) (gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) ) #109 PREEMPT Mon Nov 14 15:11:15 CST 2011
[ 0.000000] CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
[ 0.000000] CPU: VIVT data cache, VIVT instruction cache
--------------------------------------------------------------------------------------------