整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          C語言時間函數(shù)(4)之Linux下設(shè)置時間的函數(shù)stime()和settimeofday()

          標(biāo)準(zhǔn)C庫中只有獲取系統(tǒng)時間的API,好像還沒有設(shè)置系統(tǒng)時間的API,本文將談?wù)勅绾卧趌inux平臺設(shè)置系統(tǒng)時間,最后給出一個與平臺無關(guān)的設(shè)置系統(tǒng)時間的封閉函數(shù)。

          linux是如何管理時間的?

          在系統(tǒng)啟動時,Linux操作系統(tǒng)將時間從CMOS中讀到系統(tǒng)時間變量中,以后修改時間通過修改系統(tǒng)時間實現(xiàn)。為了保持系統(tǒng)時間與CMOS時間的一致性,Linux每隔11分鐘會將系統(tǒng)時間寫入CMOS,同步時間。從這可以看出,獲取系統(tǒng)時間有兩個途徑,一種是從CMOS中讀,一種是從系統(tǒng)中讀,但修改時間卻只有一種,即修改linux系統(tǒng)中的時間,而修改CMOS中的時間是無效的,因為CMOS中的時間會被定時重寫掉。另外還有一點要注意,修改了系統(tǒng)時間并不是馬上生效的,假如你修改了系統(tǒng)時間并馬上關(guān)機,再開機的時候,時間還是原來的,因為修改的時間還沒有來得及寫入CMOS中。

          Linux下設(shè)置系統(tǒng)時間:

          1.Linux下設(shè)置系統(tǒng)時間的函數(shù)有好幾個,先來看看最常用的stime()函數(shù),這個函數(shù)只能精確到秒。

          #define /*如果你使用的是glib2的話,必須先定義這個宏才能使用*/

          #include

          int stime(time_t *t);

          參數(shù)說明:

          t是以秒為單位的時間值,從GMT1970年1月1日0時0分0秒開始計算。

          返回值:

          成功返回0,錯誤返回-1,errno錯誤碼,EFAULT表示傳遞的參數(shù)錯誤,如時間值是無效的值,EPERM表示權(quán)限不夠,注意只有root用戶才有修改系統(tǒng)時間的權(quán)限。如果要讓普通程序修改系統(tǒng)時間,可以先切換到root用戶操作,修改完成后,再切換到普通用戶,或者用命令chmod +s給執(zhí)行文件加上root用戶的權(quán)限。

          例子:

          int main(void)
          {
                  long int t = 111111111;
                  printf("設(shè)置系統(tǒng)時間前的時間是:");
                  fflush(stdout);
                  system("date");
                  stime(&t);
                  printf("設(shè)置系統(tǒng)時間后的時間是:");
                  fflush(stdout);
                  system("date");
                  return 0;
          }

          
          
          

          2.通過()函數(shù)來設(shè)置系統(tǒng)時間,這個函數(shù)設(shè)置的精度可以精確到微秒。

          #include

          linux顯示時間到秒_linux系統(tǒng)時間時間秒數(shù)_linux秒數(shù)轉(zhuǎn)為時間

          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參數(shù)為時區(qū),時區(qū)結(jié)構(gòu)中在linux中不支持,應(yīng)該置為0,通常將參數(shù)tz設(shè)置為NULL,表示使用當(dāng)前系統(tǒng)的時區(qū)。該函數(shù)是glib中的,但在mingw中沒有實現(xiàn)。

          舉例:

           1 #include 
            2 #include 
            3 #include 
            4 
            5 int main(void)
            6 {
            7         struct timeval stime;
            8 
            9         gettimeofday(&stime,NULL);
           10         printf("現(xiàn)在的時間秒數(shù)是:%ld,毫秒數(shù)是:%ld\n現(xià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("現(xiàn)在的時間秒數(shù)是:%ld,毫秒數(shù)是:%ld\n現(xiàn)在的時間是:",stime.tv_sec,stime.tv_usec);
           17         fflush(stdout);
           18         system("date");
           19 
           20 
           21 
           22         return 0;
           23 }
          

          結(jié)果:

          linux顯示時間到秒_linux系統(tǒng)時間時間秒數(shù)_linux秒數(shù)轉(zhuǎn)為時間

          3.設(shè)置CMOS時間,其實它是通過RTC(Real-time clock)設(shè)備驅(qū)動來完成的,你可以用ioctl()函數(shù)來設(shè)置時間,當(dāng)然也可以通過操作/dev/rtc設(shè)備文件,在此就不詳細說明了。

          二、一個封裝的設(shè)置系統(tǒng)時間的函數(shù)

          //設(shè)置成功返回true,否則返回false

          bool (struct tm& t)

          #ifdef _WIN32

          st;

          memset(&st, 0, sizeof());

          st.wYear = t.tm_year + 1970; //注意struct tm結(jié)構(gòu)中的年是從1970年開始的計數(shù)

          st.wMonth = t.tm_mon + 1; //注意struct tm結(jié)構(gòu)中的月份是從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結(jié)構(gòu)時間轉(zhuǎn)換成GMT時間time_t

          struct time_t st;

          st = mktime(&t);

          if(st==-1)

          return false;

          if(!stime(st))

          return true;

          else

          return false;

          #endif


          主站蜘蛛池模板: 国产精品视频第一区二区三区| 国模无码视频一区| 竹菊影视欧美日韩一区二区三区四区五区 | 免费萌白酱国产一区二区| 国产午夜精品一区理论片飘花| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲国产精品第一区二区三区| 日本激情一区二区三区| 伊人久久大香线蕉av一区| 国产乱码精品一区三上| 精品福利一区二区三区免费视频| 制服中文字幕一区二区| 国产成人一区二区三区精品久久 | 亚洲一区二区三区免费视频| 三上悠亚精品一区二区久久| 国产一区二区三区在线观看免费 | 搜日本一区二区三区免费高清视频| 国产一区二区三区韩国女主播| 亚洲国产一区在线| 国产一区视频在线| 亚洲线精品一区二区三区| 精品一区二区三区高清免费观看| 亚洲精品无码一区二区| 91无码人妻精品一区二区三区L| 国产成人无码一区二区三区 | 亚洲AV无码一区二区二三区软件| 四虎一区二区成人免费影院网址| 无码aⅴ精品一区二区三区 | 国产精品分类视频分类一区| 久久国产精品一区二区| 国产视频一区在线观看| 中文字幕乱码一区二区免费| 超清无码一区二区三区| 中文字幕一精品亚洲无线一区| 中文字幕一区二区三区乱码| 丝袜人妻一区二区三区网站| 国产一区三区二区中文在线| 久久国产精品一区| 日韩精品无码一区二区视频| 国偷自产一区二区免费视频| 国99精品无码一区二区三区|