[英]C program delivers only the UTC time as localtime on Linux using GCC
我有一個在兩個配置了相同時區的不同RHEL6服務器上運行的C程序。 C程序使用time.h
的時間函數。 在其中一台服務器上,本地時間已正確確定,在另一台服務器上,UTC(默認)時間的顯示與所配置的時區無關。
我試圖查看到/etc/localtime
的鏈接是否斷開,但這是到/usr/share/zoneinfo/<timezone>
的正確軟鏈接(在本例中為Europe / Berlin)。 我已經使用zdump
檢查了時區文件,並且文件內容正確。 使用date
也可以正確顯示系統的時區和時間。 我的bash或其他任何地方都沒有$TZ
變量的定義!
作為附加測試,我運行了以下代碼,無論是否包含$TZ
變量:
::time_t aclock;
::tm tm_tmp;
::tm *newtime;
setenv("TZ", "Europe/Berlin", 1);
tzset();
::time( &aclock );
newtime = ::localtime_r( &aclock, &tm_tmp );
printf("\nDEBUG TIME: %d ", aclock);
printf("\nDEBUG TIMEZONE: %s \n", newtime->tm_zone);
printf("DEBUG HOUR: %d \n", newtime->tm_hour);
使用上面的代碼並以不同的方式設置TZ參數,假設此時服務器時間為Europe/Berlin, CEST
,我將在故障服務器上獲得以下輸出:
without setenv:
DEBUG TIME: 1524241319
DEBUG TIMEZONE: UTC
DEBUG HOUR: 16
setenv("TZ", "Europe/Berlin", 1);
DEBUG TIME: 1524241319
DEBUG TIMEZONE: Europe
DEBUG HOUR: 16
setenv("TZ", "/etc/localtime", 1);
DEBUG TIME: 1524241319
DEBUG TIMEZONE: CEST
DEBUG HOUR: 18
因此,由於顯示了UTC時間並且時區“歐洲”無效,因此似乎找不到“歐洲/柏林”時間。
正如我所說,另一台機器上的輸出/行為是預期的:
without setenv:
DEBUG TIME: 1524241711
DEBUG TIMEZONE: CEST
DEBUG HOUR: 18
setenv("TZ", "Europe/Berlin", 1);
DEBUG TIME: 1524241711
DEBUG TIMEZONE: CEST
DEBUG HOUR: 18
setenv("TZ", "/etc/localtime", 1);
DEBUG TIME: 1524241711
DEBUG TIMEZONE: CEST
DEBUG HOUR: 18
PS在兩台機器上都使用相同的gcc版本4.4.7 。
我的時區數據庫是否在故障服務器上損壞? 有人遇到過類似的問題並解決了嗎?
我終於弄清楚了,問題出在libc.so
庫中,該庫針對其中一台機器進行了不同的編譯,僅用於某些C應用程序(Linux本身除外)。 這解釋了為什么date
傳遞wright輸出而不提供C程序。 使用ldd libc.so
我發現鏈接器也默認設置為位於/home/mqm/lib
路徑,它不適合我的服務器/home/mqm/lib/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2
。 要恢復,這是完整的解決方案:
問題 :您的Linux系統正在使用date
或某些應用程序交付日期和時間,但是使用C程序卻輸出錯誤。
解決方案 :確保代碼中沒有編程錯誤后,請通過
strace -e trace=open,close,read,write,connect,accept yourCProgram
哪個路徑用於獲取時間/時區。 您也可以檢查ldd libc.so
以查看鏈接器的默認路徑在哪里。 如果路徑與您的linux系統配置不對應,請考慮重新編譯C庫以適合您的系統配置,或將$TZ='fullpathtotimezone'
為修補程序/解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.