1. 程式人生 > >Linux 程式獲取檔案系統掛載資訊

Linux 程式獲取檔案系統掛載資訊

linux shell可以通過檢視/etc/mtab或者/proc/mounts檔案來獲取當前檔案系統掛載資訊,程式內直接讀取/etc/mtab或者/proc/mounts,解析字串較為繁瑣,可以使用GNU C Library提供的mntent.h中的庫函式

FILE *setmntent(const char *filename, const char *type);
struct mntent *getmntent(FILE *filep);
int endmntent(FILE *filep);

1、setmntent用來開啟/etc/mtab或者同樣格式的table檔案
引數filename為table檔案的路徑,例如”/etc/mtab”
引數type為開啟檔案的模式(與open型別,例如“r”為只讀開啟)
成功時,返回FILE指標(用於mntent操作),失敗時返回NULL

2、getmntent用來讀取檔案的每一行,解析每一行的引數到mntent結構,mntent結構的儲存空間是靜態分配的(不需要free),結構的值會在下一次getmntent時被覆蓋。
引數filep是setmntent返回的FILE指標
成功時返回指向mntent的指標,錯誤時返回NULL

mntent結構體定義如下:

struct mntent
  {
    char *mnt_fsname;           /* 檔案系統對應的裝置路徑或者伺服器地址  */
    char *mnt_dir;              /* 檔案系統掛載到的系統路徑 */
    char
*mnt_type; /* 檔案系統型別: ufs, nfs, 等 */ char *mnt_opts; /* 檔案系統掛載引數,以逗號分隔 */ int mnt_freq; /* 檔案系統備份頻率(以天為單位) */ int mnt_passno; /* 開機fsck的順序,如果為0,不會進行check */ };

3、endmntent用來關閉開啟的table檔案,總是返回1

示例程式:

#include <stdio.h>
#include <mntent.h>
#include <errno.h> #include <string.h> int main(void) { char *filename = "/proc/mounts"; FILE *mntfile; struct mntent *mntent; mntfile = setmntent(filename, "r"); if (!mntfile) { printf("Failed to read mtab file, error [%s]\n", strerror(errno)); return -1; } while(mntent = getmntent(mntfile)) printf("%s, %s, %s, %s\n", mntent->mnt_dir, mntent->mnt_fsname, mntent->mnt_type, mntent->mnt_opts); endmntent(mntfile); return 0; }