1. 程式人生 > >linux系統呼叫之mount()/umount()函式詳解

linux系統呼叫之mount()/umount()函式詳解

轉載自:http://blog.sina.com.cn/s/blog_6385c7310100iqmn.html

功能描述:
mount掛上檔案系統,umount執行相反的操作。

標頭檔案:

#include <sys/mount.h>  

#include <errno.h> //errno的判斷


用法:  

int mount(const char *source, const char *target,
   const char *filesystemtype, unsigned long mountflags, const void *data);

int umount(const char *target);

int umount2(const char *target, int flags);


引數:   
source:將要掛上的檔案系統,通常是一個裝置名。
target:檔案系統所要掛在的目標目錄。
filesystemtype:檔案系統的型別,可以是"ext2","ext3","msdos","proc","nfs","iso9660", "vfat" 。。。


mountflags:指定檔案系統的讀寫訪問標誌,可能值有以下

MS_BIND:執行bind掛載,使檔案子目錄樹在檔案系統內的另一個點上可視。

MS_DIRSYNC:同步目錄的更新。
MS_MANDLOCK:允許在檔案上執行強制鎖。
MS_MOVE:移動子目錄樹。
MS_NOATIME:不要更新檔案上的訪問時間。
MS_NODEV:不允許訪問裝置檔案。
MS_NODIRATIME:不允許更新目錄上的訪問時間。
MS_NOEXEC:不允許在掛上的檔案系統上執行程式。
MS_NOSUID:執行程式時,不遵照set-user-ID 和 set-group-ID位。
MS_RDONLY:指定檔案系統為只讀。
MS_REMOUNT:重新載入檔案系統。這允許你改變現存檔案系統的mountflag和資料,而無需使用先解除安裝,再掛上檔案系統的方式。
MS_SYNCHRONOUS:同步檔案的更新。
MNT_FORCE:強制解除安裝,即使檔案系統處於忙狀態。
MNT_EXPIRE:將掛載點標誌為過時。

data:檔案系統特有的引數。
    
返回說明:   
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值   
EACCES:權能不足,可能原因是,路徑的一部分不可搜尋,或者掛載只讀的檔案系統時,沒有指定 MS_RDONLY 標誌。
EAGAIN:成功地將不處於忙狀態的檔案系統標誌為過時。
EBUSY:一. 原始檔系統已被掛上。或者不可以以只讀的方式重新掛載,因為它還擁有以寫方式開啟的檔案。二. 目標處於忙狀態。
EFAULT: 記憶體空間訪問出錯。
EINVAL:操作無效,可能是原始檔系統超級塊無效。
ELOOP :路徑解析的過程中存在太多的符號連線。
EMFILE:無需塊裝置要求的情況下,無用裝置表已滿。
ENAMETOOLONG:路徑名超出可允許的長度。
ENODEV:核心不支援某中檔案系統。
ENOENT:路徑名部分內容表示的目錄不存在。
ENOMEM: 核心記憶體不足。
ENOTBLK:source不是塊裝置。
ENOTDIR:路徑名的部分內容不是目錄。
EPERM : 呼叫者權能不足。
ENXIO:塊主裝置號超出所允許的範圍。

可以使用strerror(errno):獲取errno對應的錯誤。

應用例項:

#include <sys/mount.h>  

#include <errno.h> 

ret = mount(source, target, "vfat", 0, NULL)

if(ret < 0)

    if(EBUSY == errno)

printf("error:%s\n", strerror(errno))

關於errno

經常在呼叫linux 系統api 的時候會出現一些錯誤,比方說使用open() write() creat()之類的函式有些時候會返回-1,也就是呼叫失敗,這個時候往往需要知道失敗的原因。這個時候使用errno這個全域性變數就相當有用了。
  在程式程式碼中包含 #include <errno.h>,然後每次程式呼叫失敗的時候,系統會自動用用錯誤程式碼填充errno這個全域性變數,這樣你只需要讀errno這個全域性變數就可以獲得失敗原因了。

  根據man errno 描述,errno是執行緒安全的。