自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C語(yǔ)言操作時(shí)間函數(shù),實(shí)現(xiàn)定時(shí)執(zhí)行某個(gè)任務(wù)小程序

開發(fā) 后端
時(shí)間操作函數(shù)在實(shí)際項(xiàng)目開發(fā)中會(huì)經(jīng)常用到,最近做項(xiàng)目也正好用到就正好順便整理一下。

 [[345952]]

時(shí)間操作函數(shù)在實(shí)際項(xiàng)目開發(fā)中會(huì)經(jīng)常用到,最近做項(xiàng)目也正好用到就正好順便整理一下。

時(shí)間概述

 

 


由上圖可知:

 

 

1.通過(guò)系統(tǒng)調(diào)用函數(shù)time()可以從內(nèi)核獲得一個(gè)類型為time_t的1個(gè)值,該值叫calendar時(shí)間,即從1970年1月1日的UTC時(shí)間從0時(shí)0分0妙算起到現(xiàn)在所經(jīng)過(guò)的秒數(shù)。而該時(shí)間也用于紀(jì)念UNIX的誕生。

2.函數(shù)gmtime()、localtime()可以將calendar時(shí)間轉(zhuǎn)變成struct tm結(jié)構(gòu)體類型變量中。通過(guò)該結(jié)構(gòu)體成員可以很方便的得到當(dāng)前的時(shí)間信息。我們也可以通過(guò)函數(shù)mktime將該類型結(jié)構(gòu)體的變量轉(zhuǎn)變成calendar時(shí)間。

  1. struct tm{ 
  2.  int tm_sec;/*秒數(shù)*/ 
  3.  int tm_min; /*分鐘*/ 
  4.  int tm_hour;/*小時(shí)*/ 
  5.  int tm_mday;/*日期*/ 
  6.  int tm_mon; /*月份*/ 
  7.  int tm_year; /*從1990年算起至今的年數(shù)*/ 
  8.  int tm_wday; /*星期*/ 
  9.  int tm_yday; /*從今年1月1日算起至今的天數(shù)*/ 
  10.  int tm_isdst; /*日光節(jié)約時(shí)間的旗標(biāo)*/ 
  11. }; 

3.asctime()和ctime()函數(shù)產(chǎn)生形式的26字節(jié)字符串,這與date命令的系統(tǒng)默認(rèn)輸出形式類似:Tue Feb 10 18:27:38 2020/n/0.

4.strftime()將一個(gè)struct tm結(jié)構(gòu)格式化為一個(gè)字符串。

常用時(shí)間函數(shù)及舉例

1、time函數(shù)

  1. 頭文件:time.h 
  2. 函數(shù)定義:time_t time (time_t *t) 
  3. 說(shuō)明: 
  4.  返回從1970年1月1日的UTC時(shí)間從0時(shí)0分0妙算起到現(xiàn)在所經(jīng)過(guò)的秒數(shù)。 

舉例如下:

  1. #include<stdio.h> 
  2. #include<time.h> 
  3. int main(){ 
  4.  time_t timep; 
  5.   
  6.  long seconds = time(&timep); 
  7.  printf("%ld\n",seconds); 
  8.  printf("%ld\n",timep); 
  9.  return 0; 

輸出:

有興趣的同學(xué)可以計(jì)算下,從1970年1月1日0時(shí)0分0秒到現(xiàn)在經(jīng)歷了多少秒。

 

附:time_t 一路追蹤發(fā)現(xiàn)就是從long類型經(jīng)過(guò)不斷的typedef ,#define定義過(guò)來(lái)的。

2、ctime函數(shù)

  1. 定義:char *ctime(const time_t *timep); 
  2. 說(shuō)明:將參數(shù)所指的time_t結(jié)構(gòu)中的信息轉(zhuǎn)換成真實(shí)世界的時(shí)間日期表示方法,然后將結(jié)果以字符串形式返回。 
  3. 注意這個(gè)是本地時(shí)間。 

舉例如下:

  1. #include <stdio.h> 
  2. #include<time.h> 
  3. int main(void) { 
  4.  time_t timep; 
  5.   
  6.  time(&timep); 
  7.  printf("%s\n",ctime(&timep)); 
  8.  return 0; 

輸出:

 

3、gmtime函數(shù)

  1. 定義:struct tm *gmtime(const time_t *timep); 
  2. 說(shuō)明:將參數(shù)timep所指的time_t結(jié)構(gòu)中的信息轉(zhuǎn)換成真實(shí)世界所使用的時(shí)間日期表示方法,然后將結(jié)果由結(jié)構(gòu)tm返回。此函數(shù)返回的時(shí)間日期未經(jīng)時(shí)區(qū)轉(zhuǎn)換,而是UTC時(shí)間。 

舉例如下:

  1. #include <stdio.h> 
  2. #include<time.h> 
  3.   
  4. int main(void) { 
  5.  char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; 
  6.   
  7.  time_t timep; 
  8.  struct tm *p; 
  9.   
  10.  time(&timep); 
  11.  p = gmtime(&timep); 
  12.  printf("%d/%d/%d ",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday); 
  13.  printf("%s %d:%d:%d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec); 
  14.  return 0; 

輸出:

 

4、 strftime函數(shù)

  1. #include <time.h>  
  2. 定義:   
  3. size_t strftime(char *s, size_t max, const char *format,const struct tm *tm); 
  4. 說(shuō)明: 
  5. 類似于snprintf函數(shù),我們可以根據(jù)format指向的格式字符串,將struct tm結(jié)構(gòu)體中信息輸出到s指針指向的字符串中,最多為max個(gè)字節(jié)。當(dāng)然s指針指向的地址需提前分配空間,比如字符數(shù)組或者malloc開辟的堆空間。 
  6. 其中,格式化字符串各種日期和時(shí)間的詳細(xì)的確切表示方法有如下多種,我們可以根據(jù)需要來(lái)格式化各種各樣的含時(shí)間字符串。 
  7.     %a 星期幾的簡(jiǎn)寫 
  8.     %A 星期幾的全稱 
  9.     %b 月分的簡(jiǎn)寫 
  10.     %B 月份的全稱 
  11.     %c 標(biāo)準(zhǔn)的日期的時(shí)間串 
  12.     %C 年份的前兩位數(shù)字 
  13.     %d 十進(jìn)制表示的每月的第幾天 
  14.     %D 月/天/年 
  15.     %e 在兩字符域中,十進(jìn)制表示的每月的第幾天 
  16.     %F 年-月-日 
  17.     %g 年份的后兩位數(shù)字,使用基于周的年 
  18.     %G 年分,使用基于周的年 
  19.     %h 簡(jiǎn)寫的月份名 
  20.     %H 24小時(shí)制的小時(shí) 
  21.     %I 12小時(shí)制的小時(shí) 
  22.     %j 十進(jìn)制表示的每年的第幾天 
  23.     %m 十進(jìn)制表示的月份 
  24.     %M 十時(shí)制表示的分鐘數(shù) 
  25.     %n 新行符 
  26.     %p 本地的AM或PM的等價(jià)顯示 
  27.     %r 12小時(shí)的時(shí)間 
  28.     %R 顯示小時(shí)和分鐘:hh:mm 
  29.     %S 十進(jìn)制的秒數(shù) 
  30.     %t 水平制表符 
  31.     %T 顯示時(shí)分秒:hh:mm:ss 
  32.     %u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0) 
  33.     %U 第年的第幾周,把星期日做為第一天(值從0到53) 
  34.     %V 每年的第幾周,使用基于周的年 
  35.     %w 十進(jìn)制表示的星期幾(值從0到6,星期天為0) 
  36.     %W 每年的第幾周,把星期一做為第一天(值從0到53) 
  37.     %x 標(biāo)準(zhǔn)的日期串 
  38.     %X 標(biāo)準(zhǔn)的時(shí)間串 
  39.     %y 不帶世紀(jì)的十進(jìn)制年份(值從0到99) 
  40.     %Y 帶世紀(jì)部分的十制年份 
  41.     %z,%Z 時(shí)區(qū)名稱,如果不能得到時(shí)區(qū)名稱則返回空字符。 
  42.     %% 百分號(hào) 
  43. 返回值: 
  44. 成功的話返回格式化之后s字符串的字節(jié)數(shù),不包括null終止字符,但是返回的字符串包括null字節(jié)終止字符。否則返回0,s字符串的內(nèi)容是未定義的。值得注意的是,這是libc4.4.4以后版本開始的。對(duì)于一些的老的libc庫(kù),比如4.4.1,如果給定的max較小的話,則返回max值。即返回字符串所能容納的最大字節(jié)數(shù)。 

舉例如下:

  1.  1 #include <stdio.h> 
  2.  2 #include <time.h> 
  3.  3  
  4.  4 #define BUFLEN 255 
  5.  5 int main(int argc, char **argv) 
  6.  6 { 
  7.  7     time_t t = time( 0 );    
  8.  8     char tmpBuf[BUFLEN];    
  9.  9                                                                              
  10. 10     strftime(tmpBuf, BUFLEN, "%Y%m%d%H%M%S", localtime(&t)); //format date a 
  11. 11     printf("%s\n",tmpBuf); 
  12. 12     return 0; 
  13. 13 } 

執(zhí)行結(jié)果如下:

輸出結(jié)果表示YYYYmmDDHHMMSS

 

5、 asctime函數(shù)

  1. 定義: 
  2. char *asctime(const struct tm *timeptr); 
  3. 說(shuō)明: 
  4.  將參數(shù)timeptr所指的struct tm結(jié)構(gòu)中的信息轉(zhuǎn)換成真實(shí)時(shí)間所使用的時(shí)間日期表示方法,結(jié)果以字符串形態(tài)返回。與ctime()函數(shù)不同之處在于傳入的參數(shù)是不同的結(jié)構(gòu)。 
  5. 返回值: 
  6.  返回的也是UTC時(shí)間。 

舉例如下:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include<time.h> 
  4. int main(void) { 
  5.  time_t timep; 
  6.   
  7.  time(&timep); 
  8.  printf("%s\n",asctime(gmtime(&timep))); 
  9.  return EXIT_SUCCESS; 

輸出:

 

6、 localhost函數(shù)

  1. struct tm *localhost(const time_t *timep); 
  2. 取得當(dāng)?shù)啬壳暗臅r(shí)間和日期 

舉例如下:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include<time.h> 
  4.   
  5. int main(void) { 
  6.  char *wday[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; 
  7.  time_t timep; 
  8.  struct tm *p; 
  9.   
  10.  time(&timep); 
  11.  p = localtime(&timep); 
  12.  printf("%d/%d/%d ",(1900+p->tm_year),(1+p->tm_mon),p->tm_mday); 
  13.  printf("%s %d:%d:%d\n",wday[p->tm_wday],p->tm_hour,p->tm_min,p->tm_sec); 
  14.  return EXIT_SUCCESS; 

輸出:

 

7、mktime函數(shù)

  1. 定義:time_t mktime(struct tm *timeptr); 
  2. 說(shuō)明: 
  3.  用來(lái)將參數(shù)timeptr所指的tm結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)換成從1970年1月1日的UTC時(shí)間從0時(shí)0分0妙算起到現(xiàn)在所經(jīng)過(guò)的秒數(shù)。 

舉例如下:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include<time.h> 
  4.   
  5. int main(void) { 
  6.  time_t timep; 
  7.  struct tm *p; 
  8.   
  9.  time(&timep); 
  10.  printf("time():%ld\n",timep); 
  11.  p = localtime(&timep); 
  12.  timep = mktime(p); 
  13.  printf("time()->localtime()->mktime():%ld\n",timep); 
  14.  return EXIT_SUCCESS; 

輸出:

 

8、 gettimeofday函數(shù)

  1. 定義: 
  2. int gettimeofday(struct timeval *tv,struct timezone *tz); 
  3. 說(shuō)明: 
  4.  把目前的時(shí)間由tv所指的結(jié)構(gòu)返回,當(dāng)?shù)貢r(shí)區(qū)信息則放到有tz所指的結(jié)構(gòu)中, 

結(jié)構(gòu)體timeval 定義如下:

  1. struct timeval{ 
  2.  long tv_sec; /*秒*/ 
  3.  long tv_usec; /*微秒*/ 
  4. }; 

結(jié)構(gòu)體timezone定義如下:

  1. struct timezone{ 
  2.  int tz_minuteswest; /*和greenwich時(shí)間差了多少分鐘*/ 
  3.  int tz_dsttime; /*日光節(jié)約時(shí)間的狀態(tài)*/ 

舉例如下:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include<time.h> 
  4. #include<sys/time.h> 
  5.   
  6. int main(void) { 
  7. struct timeval tv; 
  8. struct timezone tz; 
  9. gettimeofday(&tv,&tz); 
  10. printf("tv_sec :%d\n",tv.tv_sec); 
  11. printf("tv_usec: %d\n",tv.tv_usec); 
  12. printf("tz_minuteswest:%d\n",tz.tz_minuteswest); 
  13. printf("tz_dsttime:%d\n",tz.tz_dsttime); 
  14. return EXIT_SUCCESS; 

輸出:

 

 

綜合實(shí)驗(yàn)

現(xiàn)在我們利用這些時(shí)間函數(shù),來(lái)實(shí)現(xiàn)一個(gè)定時(shí)執(zhí)行某個(gè)任務(wù)得功能。

功能

  1. 程序運(yùn)行時(shí)要記錄當(dāng)前日志文件的最后修改時(shí)間;
  2. 每個(gè)10秒鐘就檢查下log文件是否被修改,如果沒(méi)有被修改就休眠10秒鐘;
  3. 如果log文件被修改了,就將當(dāng)前的日志文件拷貝成備份文件,備份文件名字加上當(dāng)前時(shí)間;
  4. 通過(guò)curl發(fā)送給ftp服務(wù)器;
  5. 刪除備份文件,重復(fù)步驟2。

程序流程圖如下:

 

在這里插入圖片描述

 

函數(shù)功能介紹

init()

首先記錄當(dāng)前l(fā)og文件時(shí)間,并記錄到全局變量last_mtime中。

check_file_change()讀取文件最后修改時(shí)間,并和last_mtime進(jìn)行比較,如果相同就返回0,不同就返回1.

file_name_add_time()將當(dāng)前的日志文件拷貝成備份文件,備份文件名字加上當(dāng)前時(shí)間。

stat()

得到對(duì)應(yīng)文件的屬性信息,存放到struct stat結(jié)構(gòu)體變量中。

運(yùn)行截圖:

第一步:

 

因?yàn)閘og文件沒(méi)有被修改過(guò),所以程序不會(huì)上傳。

 

第二步:手動(dòng)輸入字符串 yikoulinux 到日志文件 t.log中。

 

第三步:因?yàn)槲募l(fā)生了改變,所以打印“file updated”,同時(shí)可以看到curl上傳文件的log信息。


以下是FTP服務(wù)器的根目錄,可以看到,上傳的日志文件:t-2020-7-26-1-19-45.log。

 

 

 

 

【補(bǔ)充】

1.配置信息,直接在代碼中寫死,通常應(yīng)該從配置文件中讀取,為方便讀者閱讀,本代碼沒(méi)有增加該功能;

2.FTP服務(wù)器搭建,本文沒(méi)有說(shuō)明,相關(guān)文件比較多,大家可以自行搜索,一口君用的是File zilla;

 

3.通常這種需要長(zhǎng)時(shí)間運(yùn)行的程序,需要設(shè)置成守護(hù)進(jìn)程,本文沒(méi)有添加相應(yīng)功能,讀者可以自行搜索。如果強(qiáng)烈要求可以單開一篇詳細(xì)介紹。

4.代碼中time的管理函數(shù),請(qǐng)讀者自行搜索相關(guān)文章。

5.curl也提供了相關(guān)的函數(shù)庫(kù)curl.lib,如果要實(shí)現(xiàn)更靈活的功能可以使用對(duì)應(yīng)的api。

之所以先把文件拷貝成備份文件,主要是考慮其他模塊隨時(shí)可能修改日志文件,起到一定保護(hù)作用。

代碼如下

代碼如下:

  1. /*************************************************** 
  2.            Copyright (C)  公眾號(hào): 一口linux   
  3. ***************************************************/ 
  4. #include <sys/stat.h> 
  5. #include <stdio.h> 
  6. #include <stdlib.h> 
  7. #include <unistd.h> 
  8. #include <time.h> 
  9.   
  10. typedef struct stat ST; 
  11. unsigned long last_mtime; 
  12.  
  13. /*用戶名密碼暫時(shí)寫死,實(shí)際應(yīng)該保存在配置文件*/ 
  14. char name[32]="user"
  15. char pass[32] ="123456"
  16. char ip[32]     ="192.168.43.117"
  17. char filename[32]="t.log"
  18. char dstfile[256]  ={0}; 
  19.  
  20. int init(void) 
  21.  //準(zhǔn)備結(jié)構(gòu)體 
  22.  ST status; 
  23.   
  24.  //調(diào)用stat函數(shù) 
  25.  int res = stat(filename,&status); 
  26.  if(-1 == res) 
  27.  { 
  28.   perror("error:open file fail\n"); 
  29.   return 0; 
  30.  } 
  31.  last_mtime = status.st_mtime; 
  32.  printf("init time:%s \n",ctime(&last_mtime)); 
  33.  return 1; 
  34.   
  35. int  check_file_change(void) 
  36.  //準(zhǔn)備結(jié)構(gòu)體 
  37.  ST status; 
  38.   
  39.  //調(diào)用stat函數(shù) 
  40.  int res = stat(filename,&status); 
  41.  if(-1 == res) 
  42.  { 
  43.   perror("error:open file fail\n"); 
  44.   return 0; 
  45.  } 
  46. // printf("old:%s new:%s",ctime(&last_mtime),ctime(&status.st_mtime)); 
  47.  if(last_mtime == status.st_mtime) 
  48.  { 
  49.   printf("file not change\n"); 
  50.   return 0; 
  51.  }else
  52.   printf("file updated\n");  
  53.   last_mtime = status.st_mtime; 
  54.   return 1; 
  55.  } 
  56.  
  57. void file_name_add_time(void) 
  58.  ST status; 
  59.  time_t t;   
  60.  struct tm *tblock;  
  61.  char cmd[1024]={0}; 
  62.    
  63.  t = time(NULL); 
  64.  tblock = localtime(&t); 
  65.   
  66.  sprintf(dstfile,"t-%d-%d-%d-%d-%d-%d.log"
  67.   tblock->tm_year+1900, 
  68.   tblock->tm_mon, 
  69.   tblock->tm_mday, 
  70.   tblock->tm_hour, 
  71.   tblock->tm_min, 
  72.   tblock->tm_sec); 
  73.  sprintf(cmd,"cp %s %s",filename,dstfile); 
  74. // printf("cdm=%s\n",cmd); 
  75.  system(cmd); 
  76. int main(void) 
  77.  
  78.  char cmd[1024]={0}; 
  79.  
  80.  init(); 
  81.  while(1) 
  82.  {  
  83.   if(check_file_change() == 1) 
  84.   { 
  85.    file_name_add_time(); 
  86.    sprintf(cmd,"curl -u %s:%s ftp://%s/ -T %s",name,pass,ip,dstfile); 
  87.  //  printf("cdm=%s\n",cmd); 
  88.    system(cmd); 
  89.    unlink(dstfile); 
  90.   } 
  91.   sleep(10);  
  92.  } 

本文轉(zhuǎn)載自微信公眾號(hào)「 一口Linux」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 一口Linux公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 一口Linux
相關(guān)推薦

2012-02-07 13:31:14

SpringJava

2009-09-21 09:57:15

linux進(jìn)程cron

2024-01-22 00:35:00

C++函數(shù)開發(fā)

2022-07-26 08:02:33

Android微信程序

2010-03-11 19:16:32

Python語(yǔ)言

2022-08-15 15:43:29

Linuxcron

2010-02-05 15:59:26

C++函數(shù)重載

2023-09-14 12:35:28

寄存器

2021-10-14 15:34:48

C語(yǔ)言字符串函數(shù)

2010-06-09 15:15:34

MySQL定時(shí)執(zhí)行

2024-11-04 16:01:01

2024-12-27 08:24:55

2020-12-21 07:31:23

實(shí)現(xiàn)單機(jī)JDK

2010-07-15 14:54:51

at命令crontab定時(shí)執(zhí)行任務(wù)

2019-08-28 07:45:45

數(shù)據(jù)存儲(chǔ)層多線程

2024-11-25 15:00:00

C#定時(shí)任務(wù)開發(fā)

2021-09-07 13:15:01

語(yǔ)言return 1return 0

2023-12-19 08:09:06

Python定時(shí)任務(wù)Cron表達(dá)式

2022-03-28 08:31:29

線程池定時(shí)任務(wù)

2022-08-05 13:38:08

C語(yǔ)言庫(kù)函數(shù)printf()
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)