Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
標準C庫中只有獲取系統時間的API,好像還沒有設置系統時間的API,本文將談談如何在linux平臺設置系統時間,最后給出一個與平臺無關的設置系統時間的封閉函數。
linux是如何管理時間的?
在系統啟動時,Linux操作系統將時間從CMOS中讀到系統時間變量中,以后修改時間通過修改系統時間實現。為了保持系統時間與CMOS時間的一致性,Linux每隔11分鐘會將系統時間寫入CMOS,同步時間。從這可以看出,獲取系統時間有兩個途徑,一種是從CMOS中讀,一種是從系統中讀,但修改時間卻只有一種,即修改linux系統中的時間,而修改CMOS中的時間是無效的,因為CMOS中的時間會被定時重寫掉。另外還有一點要注意,修改了系統時間并不是馬上生效的,假如你修改了系統時間并馬上關機,再開機的時候,時間還是原來的,因為修改的時間還沒有來得及寫入CMOS中。
Linux下設置系統時間:
1.Linux下設置系統時間的函數有好幾個,先來看看最常用的stime()函數,這個函數只能精確到秒。
#define /*如果你使用的是glib2的話,必須先定義這個宏才能使用*/
#include
int stime(time_t *t);
參數說明:
t是以秒為單位的時間值,從GMT1970年1月1日0時0分0秒開始計算。
返回值:
成功返回0,錯誤返回-1,errno錯誤碼,EFAULT表示傳遞的參數錯誤,如時間值是無效的值,EPERM表示權限不夠,注意只有root用戶才有修改系統時間的權限。如果要讓普通程序修改系統時間,可以先切換到root用戶操作,修改完成后,再切換到普通用戶,或者用命令chmod +s給執行文件加上root用戶的權限。
例子:
int main(void)
{
long int t = 111111111;
printf("設置系統時間前的時間是:");
fflush(stdout);
system("date");
stime(&t);
printf("設置系統時間后的時間是:");
fflush(stdout);
system("date");
return 0;
}
2.通過()函數來設置系統時間,這個函數設置的精度可以精確到微秒。
#include
int (const struct timeval *tv , const struct *tz);
struct timeval {
time_t tv_sec; /* seconds */
tv_usec; /* */
};
struct {
int ; /* minutes west of */
int ; /* type of DST */
};
tz參數為時區,時區結構中在linux中不支持,應該置為0,通常將參數tz設置為NULL,表示使用當前系統的時區。該函數是glib中的,但在mingw中沒有實現。
舉例:
1 #include
2 #include
3 #include
4
5 int main(void)
6 {
7 struct timeval stime;
8
9 gettimeofday(&stime,NULL);
10 printf("現在的時間秒數是:%ld,毫秒數是:%ld\n現在的時間是:",stime.tv_sec,stime.tv_usec);
11 fflush(stdout);
12 system("date");
13
14 stime.tv_sec = 123456789;
15 settimeofday(&stime,NULL);
16 printf("現在的時間秒數是:%ld,毫秒數是:%ld\n現在的時間是:",stime.tv_sec,stime.tv_usec);
17 fflush(stdout);
18 system("date");
19
20
21
22 return 0;
23 }
結果:
3.設置CMOS時間,其實它是通過RTC(Real-time clock)設備驅動來完成的,你可以用ioctl()函數來設置時間,當然也可以通過操作/dev/rtc設備文件,在此就不詳細說明了。
二、一個封裝的設置系統時間的函數
//設置成功返回true,否則返回false
bool (struct tm& t)
#ifdef _WIN32
st;
memset(&st, 0, sizeof());
st.wYear = t.tm_year + 1970; //注意struct tm結構中的年是從1970年開始的計數
st.wMonth = t.tm_mon + 1; //注意struct tm結構中的月份是從0開始的
st.wDay = t.tm_mday;
st.wHour = t.tm_hour;
st.wMinute = t.tm_min;
st.wSecond = t.tm_sec;
if(!(&st))
return true;
else
return false;
#else
//將struct tm結構時間轉換成GMT時間time_t
struct time_t st;
st = mktime(&t);
if(st==-1)
return false;
if(!stime(st))
return true;
else
return false;
#endif
*請認真填寫需求信息,我們會在24小時內與您取得聯系。