2012-09-19 19 views
2

我需要在Linux中找到一個系統調用來發現我的應用程序中連接的pendrive的文件系統。我發現'fdisk -l'完成了這項工作,但是現在我需要了解它是如何發生的。我沒有能力發現讀取fdisk代碼,唯一的一個想法是:如何以編程方式發現沒有安裝設備的文件系統(如「fdisk -l」)

  1. 結構statfs或statvfs未使用;
  2. fdisk不需要掛載設備來查找文件系統;

Obs:我的應用程序是用C++編寫的,運行在嵌入式linux系統中。

+2

此鏈接中的答案解釋了包含您正在查找的信息的結構: http://superuser.com/questions/328974/understanding-how-filesystem-type-is-determined-before-it-is-安裝 –

+0

只需要注意一點:你確實需要安裝設備本身(我認爲'mount'在引用設備時是一個不正確的術語,但我在這裏使用它是因爲你自己使用它)。您可能會問如何在不安裝最終存儲在設備上的文件系統的情況下執行此操作。 –

+1

您可以執行'strace -fv fdisk -l'來查看它正在使用的系統調用。 –

回答

1

您可以使用libblkidutil-linux來做到這一點。源代碼分發包括一個示例,其中列出了指定設備上的分區,包括文件系統類型。

1

命令fdisk -l顯示由系統ID字節表示的文件系統。該字節位於主引導記錄(MBR)內的分區表中。 MBR通常存儲在第一個硬盤的第一個柱面上(儘管任何硬盤都可以有MBR)。

我想你可以簡單地使用開放和閱讀系統調用從磁盤假設運行您的程序的用戶讀取MBR具有的權限:

char buf[446]; 
int fd = open("/dev/hda", O_RDONLY); 
read(fd, buf, 446); 

過目MBR Format然後讀出該分區表來獲得系統ID字節。這是系統ID字節的list of types

我只知道Linux上的fdisk是如何工作的,上次我檢查它不支持GPT或任何其他分區格式。所以這個答案只與傳統的MBR格式有關。

+1

系統ID字節不足以可靠地檢測某些文件系統。例如,值0x83被幾個不同的Linux文件系統使用。 –

+1

@約翰巴塞洛繆,這是正確的。但是OP要求提供像fdisk -l這樣的結果,這也有這個缺點。 – syplex

相關問題