簡體   English   中英

C程序使用GCC在Linux上僅將UTC時間作為本地時間傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM