2011-07-19 26 views

回答

12

它和手冊看起來一樣簡單:創建一個探針結構,初始化它,詢問一些信息,然後釋放它。你可以將前兩步合併爲一個。這是一個工作程序:

#include <stdio.h> 
#include <stdlib.h> 
#include <err.h> 
#include <blkid/blkid.h> 

int main (int argc, char *argv[]) { 
    blkid_probe pr; 
    const char *uuid; 

    if (argc != 2) { 
    fprintf(stderr, "Usage: %s devname\n", argv[0]); 
    exit(1); 
    } 

    pr = blkid_new_probe_from_filename(argv[1]); 
    if (!pr) { 
    err(2, "Failed to open %s", argv[1]); 
    } 

    blkid_do_probe(pr); 
    blkid_probe_lookup_value(pr, "UUID", &uuid, NULL); 

    printf("UUID=%s\n", uuid); 

    blkid_free_probe(pr); 

    return 0; 
} 

blkid_probe_lookup_valueuuid指向屬於pr結構,這就是爲什麼說法是const char *類型的字符串。如果需要,您可以將其複製到您自己管理的char *,但僅傳遞給printf,這不是必需的。 blkid_probe_lookup_value的第四個參數可以讓你獲得返回值的長度,以防你也需要。 blkid_do_probe,blkid_do_safeprobeblkid_do_fullprobe之間有一些細微差別,但是在設備具有已知文件系統並且只是想將UUID拉出來的情況下,應該從blkid_do_probe開始獲取第一個結果。

+0

此示例要求我輸入分區作爲正確的論點?我將如何檢查ROOT分區的UUID? – HighLife

+0

定義「ROOT分區」。裝在'/'上的設備? – hobbs

+0

yes安裝在/ – HighLife

4

首先,您需要查找以root身份掛載的設備。見人得意(3)。知道設備後,按hobbs所述使用blkid_new_probe_from_filename。

#include <stdio.h> 
#include <mntent.h> 

int main() { 
    FILE* fstab = setmntent("/etc/mtab", "r"); 
    struct mntent *e; 
    const char *devname = NULL; 
    while ((e = getmntent(fstab))) { 
     if (strcmp("/", e->mnt_dir) == 0) { 
      devname = e->mnt_fsname; 
      break; 
     } 
    } 
    printf("root devname is %s\n", devname); 
    endmntent(fstab); 
    return 0; 
} 
+0

這是非常有幫助的,我將它與hobbs文章結合起來,我會看到會發生什麼。謝謝 – HighLife