歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

linux系統中的時間及操作函數



(一)Linux系統中的時間

rtc

由rtc芯片提供的時間,可以轉換為格林尼治時間,linux中把這一類時間稱為wall time,牆上時間。rtc時間由rtc芯片來維護更新,它通常由一個專門的計時硬件來實現,軟件可以讀取該硬件來獲得年月日、時分秒等時間信息。rtc時間是可持續計時的,通常硬件上會加上一個後備電池供電,這樣即使系統關閉,rtc時間依然是正常更新的,這樣就可以保證下次系統起來的時候可以從rtc芯片中,重新讀取到正確的牆上時間。

xtime

linux系統時間是用從Epoch(1970年1月1日00:00:00 UTC)開始所經過的時間來表示,比如unix時間戳就是從Epoch開始所經過的秒數。這種時間表述方法可以很方便的轉化成我們常用的格林尼治時間,所以它也是一種牆上時間。

monotonic time

單調增長的系統運行時間(ntp影響其單調性), 記錄的是從系統啟動以來到當前的時間間隔,它不會像xtime一樣可以被用戶修改而發生跳變。不過該時間不計算休眠時間。

raw monotonic time

raw monotonic time: 該時間與monotonic時間類似,也是單調遞增的時間,唯一的不同是,raw monotonic time不會受到NTP時間調整的影響,它代表著系統獨立時鐘硬件對時間的統計。

boot time

它代表著系統上電後的總時間,包括了休眠時間。ntp服務會全部影響到上面提到的幾種時間類型。ntp就是為了校正時間的服務,為了每次啟動都能正確修改,所以rtc要更新,為了使當前時間也修改生效,所以xtime也要更新。

(二)時間操作函數

RTC時間操作:

1.rtc時間是由rtc硬件控制的,所以在linux中想要修改和獲取rtc時間就只能通過驅動的接口來獲取和修改。
[code]int rtc_test(void)
{
	struct rtc_time rtc;
	int fd = -1;
	int ret = -1;
	fd = open("/dev/rtc0", O_RDWR);
	if (fd < 0){
		return -1;
	}
	ret = ioctl(fd, RTC_RD_TIME, &rtc);
	if (ret < 0){
		return -1;
	}
	printf("\nCurrentRTC data/time is %d-%d-%d, %02d:%02d:%02d.\n", rtc.tm_mday, rtc.tm_mon + 1,
	rtc.tm_year + 1900, rtc.tm_hour, rtc.tm_min, rtc.tm_sec);
	ret = ioctl(fd, RTC_SET_TIME, &rtc);
	if (ret < 0){
		return -1;
	}
	return 0;
}

[/code]

2.除了上面這種方式操作rtc時間以外,linux中也有一個命令可以簡化rtc時間操作,hwclock,比如,可以通過system("hwclock -w");系統調用來把xtime設置到rtc硬件。

牆上時間(realtime、xtime):

linux系統中主要使用的就是xtime,它是系統運行的基礎,很多程序都是依賴於xtime來運行的,接下來將介紹將如何操作xtime。1.獲取、設置微秒級別的時間:

#include <sys/time.h>

#include <unistd.h>

struct timeval

{

inttv_sec;

inttv_usec;

};

int gettimeofday(struct timeval *tv, struct

timezone *tz);

int settimeofday(const struct timeval *tv, const struct timezone *gz);

功能描述:

gettimeofday()獲取當前時間,有tv指向的結構體返回。

settimeofday()把當前時間設成由tv指向的結構體數據。當前地區信息則設成tz指向的結構體數據。

2.獲取秒級別的時間

typedef long time_t;

time_ttime(time_t *t);

如果t是non-null,它將會把時間值填入t中

3.內核2.6版本後新增的clock api接口

獲取納秒級別的時間

struct timespec{

time_t tv_sec; /*秒s*/

long tv_nsec; /*納秒ns*/

};

int clock_getres(clockid_t clk_id , struct timespec *res);

int clock_gettime(clockid_t clk_id , struct timespec *tp);

int clock_settime(clockid_t clk_id 、 const struct timespec *tp);

編譯連接時采用-lrt才能編譯通過。

clk_id可選參數:

CLOCK_REALTIME系統全局的實時時鐘.設置此時鐘需要合適的權限.CLOCK_MONOTONIC只能被讀取,無法被設置,表示 monotonic 時間起點.CLOCK_PROCESS_CPUTIME_ID從 cpu 每進程的高分辨率計時器.CLOCK_THREAD_CPUTIME_ID

線程的特定 cpu 時間時鐘.

系統啟動時,會首先從rtc中讀取rtc時間,並設置給xtime,而當ntp對系統時間進行更新時,首先設置xtime,然後調用hwclock設置到rtc硬件中。xtime根據需要的精度,可以通過上面幾個接口來選擇使用。

Copyright © Linux教程網 All Rights Reserved