2010-04-14 30 views
13

我基本上必須爲一個類編寫一個UNIX ls命令的克隆,而且幾乎所有的工作都已經完成。我似乎無法弄清楚如何做的一件事是檢查文件是否是符號鏈接。從的man頁面,我看到有一個mode_t定義的值,S_IFLNK你如何確定使用stat()文件是否是符號鏈接?

這是我正在努力檢查文件是否是一個符號鏈接,沒有運氣(注意,stbuf是stat()返回的i節點的數據到緩衝區):

switch(stbuf.st_mode & S_IFMT){ 
    case S_IFLNK: 
     printf("this is a link\n"); 
     break; 
    case S_IFREG: 
     printf("this is not a link\n"); 
     break; 
} 

我的代碼總是打印this is not a link,即使它是,我知道一個事實,該文件是一個符號鏈接,因爲實際的ls命令說,所以,我創建了sym鏈接...

任何人都可以發現我可能會做錯了嗎?謝謝您的幫助!

+2

引用我的stat(2)手冊頁:lstat()與stat()完全相同,只是如果path是一個符號鏈接,那麼鏈接本身是stat- ed的,而不是它引用的文件。 – Philip 2010-04-14 23:20:02

回答

21

你不能。

您需要使用lstat()來統計鏈接本身,普通的stat()將遵循鏈接,因此從不「查看」鏈接本身。

+0

那麼,爲什麼你會使用stat()命令呢?我只是嘗試使用lstat(),它似乎提供了相同的信息,除了處理鏈接。只有當你知道你沒有處理任何sym-links時,你纔會使用stat()嗎? – hora 2010-04-14 08:44:27

+3

你也可以在處理符號鏈接時使用它,通常你不關心路徑是普通文件還是鏈接,你關心的是使用的文件。例如,鏈接的mtime完全不感興趣,鏈接指向的文件的mtime是。 – wich 2010-04-14 08:47:51

+2

'stat()* *處理鏈接,它只是以不同的方式處理它們 - 它跟隨鏈接並告訴你它指向的文件(正如你指出的那樣,這通常是你想要的)。 – caf 2010-04-14 09:02:30

相關問題