我的網誌清單
2014年2月23日 星期日
2014年2月19日 星期三
Linux 下的 sleep 函數
一般在撰寫程式時常需要在執行某項動作前有個短暫的延遲,通常一在 Windows 環境下我們常會使用 Sleep 函數 (注意Sleep的第一個字S是大寫),其函數原型如下所示:
void Sleep(DWORD dwMilliseconds);
其中傳入的參數是以毫秒 (milliseconds) 為單位,即傳入 Sleep(1000) 表示暫停一秒。
之後在 Linux 下撰寫程式時 (使用 Gcc/G++ 程式庫),直覺地就直接在程式中需要的地方呼叫 sleep(1000),就很愉快的編譯並執行它,沒想到竟然是暫停到天荒地老,以為程式當掉了;此時趕緊仔細一查,原來 Linux 下 sleep 的函數原型如下 (注意 sleep 全部為小寫):
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
原來如此,Linux 下 sleep 函數傳入的參數單位是以「秒」計算,難怪會有此誤差。
那麼如果在Linux下也要使用以毫秒為單位的休眠函數呢?找了一下,原來還有一個usleep,其函數原型如下:
void usleep(unsigned long usec);
其輸入參數是以微秒 (microseconds) 為單位,所以將程式中的 sleep(1000) 改為 usleep(1000000) 即可與 Windows 下暫停一秒的 Sleep(1000) 達到相同的效果囉。
後來又陸續發現很多相關函數,如:select、udelay、mdelay、nanosleep、setitimer 等,這些就等以後需要時再來仔細研究吧!
註:
1. ms意思是「毫秒」,1秒 = 1000 毫秒;us 應為 μs,是指「微秒」(即 microseconds),1毫秒 = 1000 微秒,即 1 秒 = 1000000 微秒。
2. 雖然使用 usleep 並指定一個微秒數 usleep(10) 讓系統暫停,但系統還是會暫停超過所指定的時間,這是因為 Linux 是個多工的作業環境,執行中的行程 (process) 隨時會因為各種原因被暫停大約 10 毫秒到數秒的時間 (在系統負荷非常高的時候),所以除非需要非常即時的考量,否則這項延遲應該可以接受。
文章參考 http://blog.xuite.net/yiguizi2003/blog/44125155-Windows%E4%B8%8B%E7%9A%84Sleep%E8%88%87Linux%E4%B8%8B%E7%9A%84sleep%E5%87%BD%E6%95%B8
2014年2月16日 星期日
Linux时间函数
參考網址:http://blog.csdn.net/tigerjibo/article/details/7039434
gettimeofday()函数
gettimeofday()函数
#include<sys/time.h>
int gettimeofday(struct timeval*tv,struct timezone *tz )
3.说明:
gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
4.结构体:
1>timeval
struct timeval{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
2>timezone 结构定义为:
struct timezone{
int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
int tz_dsttime;/*type of DST correction*/
}
3>在gettimeofday()函数中tv或者tz都可以为空。如果为空则就不返回其对应的结构体。
4>函数执行成功后返回0,失败后返回-1,错误代码存于errno中。
5.程序实例:
#include<stdio.h>
#include<sys/time.h>
#include<sys/time.h>
#include<unistd.h>
int main()
{
struct timeval tv;
struct timezone tz;
gettimeofday(&tv,&tz);
printf(“tv_sec:%d\n”,tv.tv_sec);
printf(“tv_usec:%d\n”,tv.tv_usec);
printf(“tz_minuteswest:%d\n”,tz.tz_minuteswest);
printf(“tz_dsttime:%d\n”,tz.tz_dsttime);
}
说明:在使用gettimeofday()函数时,第二个参数一般都为空,因为我们一般都只是为了获得当前时间,而不用获得timezone的数值
訂閱:
意見 (Atom)
