2012-09-09 58 views
0

我正在做一個stat() - 調用,返回一個結構與我想要提取的信息。到目前爲止,我成功地獲得了我想要的內容,直到獲得訪問時間,修改和最後更改文件的時間。使用ctime分段錯誤

我想用ctime來獲取它,然後用printf打印出來。

printf("File: %s",argv[1]); 
    printf("\nSize: %d",result.st_size); 
    printf("  Blocks: %d",result.st_blocks); 
    printf("  IO Block: %d",result.st_blksize); 
    printf("\nDevice: 0x%x",result.st_dev); 
    printf("  Inode: %d",result.st_ino); 
    printf("  Links: %d",result.st_nlink); 
// printf("\nAccess: %s",ctime(result.st_atime)); 

此代碼運作良好,並給出了下面的輸出:

File: /etc/passwd 
Size: 2250043   Blocks: 4416   IO Block: 4096 
Device: 0x6804   Inode: 9738432   Links: 1 

如果我去掉最後一行,我想要得到的訪問時間,我得到這樣的輸出:

File: /etc/passwd 
Size: 2250043   Blocks: 4416   IO Block: 4096 
Segmentation fault 

我該如何解決這個問題?另外,如何在之前得到分段錯誤的設備,Inode和鏈接打印出來?不應該打印它,然後產生分段錯誤?

我對C的零經驗我在之前的課程中學習過Assembly,但很簡單。我試圖讀取time.h的API,但我真的無法找到解決方案。

我非常感謝任何幫助或提示,我可以得到!

謝謝, ž

+0

的printf通常行緩衝。直到它看到一個換行符(默認情況下)纔會打印出來。換行符是最後一個失敗的printf,因此設備行不會出現在屏幕上。 –

回答

3

功能ctime期望一個const time_t *。你可能想:

printf("\nAccess: %s",ctime(&result.st_atime)); 
          ^
4

請使用

ctime(&result.st_atime) 

,不要忘記

#include <time.h> 
+1

感謝提醒'#include '! –

+0

@Zyril:你在做什麼編譯沒有'ctime()'範圍的原型?你應該設置你的編譯警告,這樣你就不能在範圍內編譯沒有原型的代碼(例如'-Werror = missing-prototypes',或者至少'-Wall'),這樣你就無法進入一團糟。這是一種自我保護措施。 –

+0

喬納森你好!這是我正在理解內核如何工作的一門課程,我們正在研究系統調用。我想在C中編寫一個函數,輸出stat返回的結構中的數據。 我對此很新,所以我不確定你的原型是什麼意思。我沒有收到任何編譯警告。 –