系統程式設計概念(檔案系統mount等函式的使用)
阿新 • • 發佈:2019-01-03
掛載檔案系統
#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