1. 程式人生 > >系統程式設計概念(檔案系統mount等函式的使用)

系統程式設計概念(檔案系統mount等函式的使用)

掛載檔案系統

#include<sys/mount.h>
int mount(const char *source,const char *target,const char *fstype,unsigned long mountflags,const void *data)

其中mountflags的值可為:
MS_BIND 建立繫結掛載,會忽略fstype,data引數
MS_DIRSYNC 同步更新路徑,注意只正對路徑
MS_MANDLOCK 允許對該檔案系統中的檔案強行鎖定記錄
MS_MOVE 令整個動作為一原子操作,不可分割
MS_NOATIME 不更新最後訪問時間(使用該標誌意在消除額外的磁碟訪問,避免每次訪問時都更新檔案i節點,可提高效能)
MS_NODEV 不允許訪問此檔案系統上的塊裝置和字元裝置
MS_NODIRATIME 不更新目錄的最後訪問時間
MS_NOEXEC 不允許在此檔案系統上執行程式或指令碼
MS_NOSUID 禁用set-user-ID和set-group-ID
MS_RDONLY 以只讀方式掛載檔案系統,在此檔案系統上不能建立和修改檔案
MS_REC
MS_RELATIME 只有當檔案最後訪問時間戳的當前值(上次更新時間)小於或等於最後一次修改或狀態更新的時間戳時,才對其進行更新
MS_REMOUNT 針對已經掛載的檔案系統,可以改變其mountflag和data
MS_STRICTATIME 只要訪問檔案,就總是更新檔案的最後訪問時間戳
MS_SYNCHRONOUS 對檔案系統上的所有檔案和目錄保持同步更新
下面我們來看一下使用mount函式的程式

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<unistd.h>
#include<error.h>
#include<sys/mount.h>
int main(int argc,char *argv[])
{
    unsigned long flags;
    char *data,*fstype;
    int j,opt;
    flags=0;
    data=NULL;
    fstype=NULL;
    while
((opt=getopt(argc,argv,"o:t:f:"))!=-1)//getopt是獲取argc和argv選項的函式,“o:t:f:”代表選項名稱為-o,-t,-f,opt用來記錄選項的名字, { switch(opt) { case 'o': data=optarg; break; case 't': fstype=optarg; break; case
'f': for(j=0;j<strlen(optarg);j++) { switch(optarg[j])//逐個讀取每個選項引數的內容 { case 'b':flags|=MS_BIND; break; case 'd':flags|=MS_DIRSYNC; break; case 'l':flags|=MS_MANDLOCK; break; case 'm':flags|=MS_MOVE; break; case 'A':flags|=MS_NOATIME; break; case 'V':flags|=MS_NODEV; break; case 'D':flags|=MS_NODIRATIME; break; case 'E':flags|=MS_NOEXEC; break; case 'S':flags|=MS_NOSUID; break; case 'r':flags|=MS_RDONLY; break; case 'c':flags|=MS_REC; break; case 'R':flags|=MS_REMOUNT; break; case 's':flags|=MS_SYNCHRONOUS;break; } } break; } } if(argc!=optind+2)//因為需要後面兩個目標檔案和原始檔 { perror("arguments wrong"); exit(1); } if(mount(argv[optind],argv[optind+1],fstype,flags,data)==-1)//使用函式不,argv[optind]是目標檔案,argv[optind+1]是原始檔 perror("mount error"); return 0; }

解除安裝檔案系統:umount()和umount2()

#include<sys/mount.h>
int umount(const char *target)      //target為檔案系統掛載點,成功返回0,失敗返回-1
int umount2(const char *target,int flags)   //成功返回0,失敗返回-1,flags可為MNT_DETACH(讓已掛載點的程序繼續使用,同時禁止新的程序訪問該掛載點,當所有程序不再使用訪問點時,系統會解除安裝相應檔案系統),MNT_EXPIRE(令掛載點到期),MNT_FORCE(即使檔案系統扔處於在用狀態,依然強行解除安裝),UMOUNT_NOFLOLLOW

獲取與檔案系統有關的資訊

#include<sys/statvfa.h>
int statvfs(const char *pathname,struct statvfs *statvfsbuf);
int fstatvfs(int fd,struct statvfs *statvfsbuf)     //成功返回0,失敗-1

這裡寫圖片描述