2017-10-06 113 views
2

我有一個非常簡單的代碼運行在Linux上,如下圖所示:clock_gettime返回一些非常大的價值

struct timespec SysTime_Test; 
#define BILLION 1000000000L 
SysTime_Test.tv_sec = 0; 
SysTime_Test.tv_nsec = 0; 
clock_settime(CLOCK_REALTIME,&SysTime_Test); 
while(1) { 
    printf("%d ",clock_gettime(CLOCK_REALTIME,&SysTime_Test)); 
    printf("%llu, %llu\n",SysTime_Test.tv_sec, SysTime_Test.tv_nsec); 
    fflush(stdout); 
} 

而且我期待着開始:

0 0, 0 

,而不是我的了:

0 97508642543791, 13184898790915571716 
0 152071907084879, 13184898790915571716 
0 184202557433736, 13184898790915571716 
0 214744069882703, 13184898790915571716 
      ............ 
0 688307164049923, 13184898790915571716 
0 715983933311791, 13184898790915571716 
0 743664997540956, 13184898790915571716 
0 770706111642868, 13184898790915571716 
0 798223967114747, 13184898790915571716 
0 825746117553923, 13184898790915571716 
0 853263973025802, 13184898790915571716 
0 881898519994901, 13184898790915571716 
0 909098547886802, 13184898790915571716 
0 936779612115967, 13184898790915571716 
0 964138553797857, 13184898790915571716 
0 992455273186978, 13184898790915571716 
0 1019973128658857, 13184898790915571716 
0 1048130934257989, 13184898790915571716 
       .......... 
0 1318713873968989, 13184898790915571716 
0 1346549557020846, 13184898790915571716 
0 1374707362619978, 13184898790915571716 
0 1402225218091857, 13184898790915571716 
0 1430700851270967, 13184898790915571716 
       .......... 
0 2643470766924857, 13184898790915571716 
0 2670988622396736, 13184898790915571716 
0 2698828600415890, 13184898790915571716 
0 2726187542097780, 13184898790915571716 
0 2754027520116934, 13184898790915571716 
0 2781704289378802, 13184898790915571716 
0 2809544267397956, 13184898790915571716 
0 2836903209079846, 13184898790915571716 (Big jump) 
0 1434656352942746714, 13184898790915571716 
0 1434694848734629725, 13184898790915571716 
      .................. 
0 1435769544041619659, 13184898790915571716 
0 1435796907278268846, 13184898790915571716 
0 1435824266219950736, 13184898790915571716 

我已經嘗試過不同的時鐘ID,我仍然有幾乎相同的事情,有一個大跳之間,我有什麼做錯了?

+0

什麼'clock_settime'返回?! –

+0

此外,這是**整個**程序?你是否包含'stdio.h'?你是否得到了關於'printf'錯誤參數的警告,你是否正確地編譯了程序? –

+0

I.e.這*不是* [mcve] –

回答

1

檢查功能的結果。

代碼有意想不到的輸出,但缺乏一個簡單的檢查,看看設置時間工作@Steve Summit。我希望這是一個早期的調試步驟。

// clock_settime(CLOCK_REALTIME,&SysTime_Test); 
if (clock_settime(CLOCK_REALTIME,&SysTime_Test)) { 
    puts("Fail Set"); 
} 

使用正確*printf()

會員tv_nseclong。用"%ld"打印。 @Antti Haapala

printf("%ld", SysTime_Test.tv_nsec); 

tv_sectime_t。在Linux系統上,必須是一些整數類型@Andrew Henle。投射到最寬(或至少很寬)的類型並打印。

printf("%jd", (intmax_t) SysTime_Test.tv_sec); 
// or 
printf("%lld", (long long) SysTime_Test.tv_sec); 

節省時間

打開所有的編譯器警告檢測問題更快。

要清楚

「clock_gettime返回一些非常大的價值」 - >不是真的。該函數每次按預期返回0並打印。這是SysTime_Test中的值顯然是意外的,因爲它們沒有正確打印。

1

同樣,該問題缺少Minimal, Complete, and Verifiable example,但從行爲上可以推斷出提交者正在使用32位平臺,而沒有使用正確的格式字符,因此導致未定義的行爲。

兩個tv_sectv_nsec計算機上64位,但該類型定義是signed long int小號的別名,因此它們應該使用%ld被顯示出來!在您的計算機上,這些可能會作爲32位值壓入堆棧/寄存器,但是在printf中將檢索到兩個64位值:第一個將由tv_nsec/tv_sec和指向格式字符串的指針的第二個字節組成,存儲的指令指針/函數返回地址。

更好的解決方案,因爲我們是在POSIX,是鑄造同時添加到,例如:

printf("%lld", (long long)SysTime_Test.tv_sec); 
printf("%lld", (long long)SysTime_Test.tv_nsec); 
+3

按照[POSIX標準](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html)的說法,'tv_sec'是'time_t'。只有'tv_nsec'是'[signed] long [int]'。 'time_t'只能是[「整數類型」](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html)。儘管如此,這足以打破一切。 UB是UB。 –

+0

@AndrewHenle是的我的意思是typedefs定義爲'long int's。 –