Linux編程環境時間日期類型timeval 及其相關API
“時間”和“日期”的概念,主要有以下幾個:
Coordinated Universal Time(UTC):國際標準時間,又稱為世界標準時間,也就是大家所熟知的格林威治標準時間(Greenwich Mean Time,GMT)。比如,中國內地的時間與UTC的時差為+8,也就是UTC+8。美國是UTC-5。
Calendar Time:日曆時間,是用“從一個標準時間點到此時的時間經過的秒數”來表示的時間。這個標準時間點對不同的編譯器來說會有所不同,但對一個編譯系統來說,這個標準時間點是不變的,該編譯系統中的時間對應的日曆時間都通過該標準時間點來衡量,所以可以說日曆時間是“相對時間”,但是無論你在哪一個時區,在同一時刻對同一個標準時間點來說,日曆時間都是一樣的。
epoch:時間點。時間點在標準C/C++中是一個整數,它用此時的時間和標準時間點相差的秒數(即日曆時間)來表示。
clock tick:時鐘計時單元(而不把它叫做時鐘滴答次數),一個clock tick不是CPU的一個刻度,而是C/C++的一個基本計時單位。
我們可以使用ANSI標準庫中的time.h標頭檔。這個標頭檔中定義的時間和日期所使用的方法,無論是在結構定義,還是命名,都具有明顯的C語言風格。下面,我將說明在C/C++中怎樣使用日期的時間功能。
struct timeval
{
time_t tv_sec; //秒
susenconds_t tv_usec; //微秒 10 e-6 秒
}
基準計算時間為1970年一月一日 UTC(世界標準時間) 0點(Epoch)
用time_t表示的時間(日曆時間)是從一個時間點(例如:1970年1月1日0時0分0秒)到此時的秒數。在time.h中,我們也可以看到time_t是一個長整型數:
#ifndef _TIME_T_DEFINED
typedef long time_t; /* 時間值 */
#define _TIME_T_DEFINED /* 避免重複定義 time_t */
#endif
大家可能會產生疑問:既然time_t實際上是長整型,到未來的某一天,從一個時間點(一般是1970年1月1日0時0分0秒)到那時的秒數(即日曆時間)超出了長整形所能表示的數的範圍怎麼辦?對time_t資料類型的值來說,它所表示的時間不能晚於2038年1月18日19時14分07秒。為了能夠表示更久遠的時間,一些編譯器廠商引入了64位甚至更長的整形數來儲存日曆時間。比如微軟在Visual C++中採用了__time64_t資料類型來儲存日曆時間,並通過_time64()函數來獲得日曆時間(而不是通過使用32位字的time()函數),這樣就可以通過該資料類型儲存3001年1月1日0時0分0秒(不包括該時間點)之前的時間。
下面的代碼示範了如何擷取當前系統時間並轉換成字串:
timeval tv;
gettimeofday(&tv,NULL);
std::cout<<ctime(&tv.tv_sec)<<endl;//將秒數轉換成目前時間的字串表示
tm及其相關API
time(取得目前的時間)
表標頭檔 #include<time.h>
定義函數 time_t time(time_t *t);
函數說明 此函數會返回從公元1970年1月1日的UTC時間從0時0分0秒算起到現在所經過的秒數。如果t 並非null 指標的話,此函數也會將傳回值存到t指標所指的記憶體。
傳回值 成功則返回秒數,失敗則返回((time_t)-1)值,錯誤原因存於errno中。
結構tm的定義為
struct tm
{
int tm_sec;//代表目前秒數,正常範圍為0-59,但允許至61秒
int tm_min;//代表目前分數,範圍0-59
int tm_hour;// 從午夜算起的時數,範圍為0-23
int tm_mday;// 目前月份的日數,範圍01-31
int tm_mon;// 代表目前月份,從一月算起,範圍從0-11
int tm_year;// 從1900 年算起至今的年數
int tm_wday;// 一星期的日數,從星期一算起,範圍為0-6
int tm_yday;// 從今年1月1日算起至今的天數,範圍為0-365
int tm_isdst;// 日光節約時間的旗標
};
樣本如下:
time_t sec = time( 0 );//擷取當前秒數(UTC)時間
struct tm tmbuf;
localtime_r( &sec, &tmbuf);//將秒數轉換成當地時區時間
GCC編譯命令
gcc -v 查看版本
尋找g++的命令協助 鍵入 info g++,會顯示出gcc的協助資訊,g++大部分參數和gcc命令相同
選項 解釋
-ansi 只支援 ANSI 標準的 C 文法。這一選項將禁止 GNU C 的某些特色,
例如 asm 或 typeof 關鍵詞。
-c -o只編譯並產生目標檔案。
-DMACRO 以字串“1”定義 MACRO 宏。
-DMACRO=DEFN 以字串“DEFN”定義 MACRO 宏。
-E 只運行 C 先行編譯器。
-g 產生調試資訊。GNU 調試器可利用該資訊。
-IDIRECTORY 指定額外的標頭檔搜尋路徑DIRECTORY。
-LDIRECTORY 指定額外的函數庫搜尋路徑DIRECTORY。
-lLIBRARY 串連時搜尋指定的函數庫LIBRARY。
-m486 針對 486 進行代碼最佳化。
-o FILE 產生指定的輸出檔案。用在產生可執行檔時。
-O0 不進行最佳化處理。
-O 或 -O1 最佳化產生代碼。
-O2 進一步最佳化。
-O3 比 -O2 更進一步最佳化,包括 inline 函數。
-shared 產生共用目標檔案。通常用在建立共用庫時。
-static 禁止使用共用串連。
-UMACRO 取消對 MACRO 宏的定義。
-w 不產生任何警告資訊。
-Wall 產生所有警告資訊。
g++ -o 目標檔案名 源檔案名稱
ldd programm 查看programm程式所依賴的共用庫(.so)檔案
ar crv mm.a x.o y.o 將x.o和y.o合并到一個靜態庫mm.a檔案中
ranlib mm.a 產生靜態庫的內容表 (不是必須)
emacs基本命令
ctrl+x+f 開啟檔案
ctrl+x+d 開啟目錄,查看該目錄的子目錄
ctrl+x+s 儲存當前buffer裡的檔案
ctrl+s 尋找當前buffer裡的文本
rename-buffer 修改當前緩衝區的名字
ctrl+shift+ - 回退
ctrl+alt+/ 對選中的代碼進行格式化
ctrl+x 鬆開後 按o 在不同的緩衝區移動焦點
alt+x選中命令緩衝區
ctrl+g取消當前命令
alt+w 複製被選中的代碼
ctrl+y 粘帖代碼
ctrl+w 剪下代碼
ctrl+x 鬆掉後按backspace 設定斷點
ctrl+x+k 關閉當前緩衝區
GDB調試命令
查看gdb協助資訊 gdb –help
注意g++編譯時間,使用-g命令
gdb 已編譯的程式檔案名稱
list 顯示原始碼
break命令設定斷點,可以後面加上函數名稱
delete breakpoints 刪除所有斷點
run 運行程式
step <count> 單步跟蹤(自動進入函數)
next <count> 單步跟蹤(不自動進入函數)
continue 繼續運行
print 變數名查看某變數的值,調試過程中改變某變數的值
info breakpoints 查看程式中斷點設定的資訊
quit 退出
info thread 列出多個線程號。 thread 查看當前線程號 thread 線程號 選擇進入哪個線程進行調試。
Unicode和MultiBytes 字串的轉換
#include <wchar.h>
size_t wcsrtombs (char *dest, const wchar_t **src, size_t len, mbstate_t *ps);
#include <stdlib.h>
size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n);
環境變數
查看環境變數
env
env也可以用來設定環境變數的值,具體看env --help
set 也可是設定環境變數
如果環境變數在一個terminal裡設定,就只對這個terminal有效
如果想全域的設定,需要修改
/etc/profile檔案