我的網誌清單

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()函数

#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<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的数值