Linux 檔案相關程式設計

2021-07-04 07:32:27 字數 4336 閱讀 1942

1. access系統呼叫

access系統呼叫用於檢測所指定的檔案訪問許可權,原型如下:

#include int access(const char *pathname, int mode);
**示例如下:
#include #include int main(int argc, char *argv)

其中f_ok用於測試這個檔案或目錄是否存在,其它mode常量還有r_ok、w_ok、x_ok,分別對應讀許可權,寫許可權和可執行許可權。access系統呼叫檢測成功的話返回0,否則返回-1,而這些mode常量可以通過或運算形成位掩碼,只要其中一項檢測沒有成功返回值都為-1。

#include int link(const char *oldpath, const char *newpath);

int unlink(const char *pathname);

link系統呼叫中的oldpath是乙個已經存在的檔名,而newpath將是要建立硬鏈結的檔名,如果newpath存在,則不會將其覆蓋。

3. rename系統呼叫

reanme系統有點類似於mv命令,用於重新命名乙個檔案或移動乙個檔案,原型如下:

#include int rename(const char *oldpath, const char *newpath);

4. mkdir、rmdir系統呼叫

mkdir、rmdir系統呼叫同命令mkdir、rmdir類似,用於建立、刪除乙個目錄,原型如下:

#include #include #include int mkdir(const char *pathname, mode_t mode);

int rmdir(const char *pathname);

5. remove函式

remove函式用於刪除乙個檔案或目錄,同rm命令類似,原型如下:

#include int remove(const char *pathname);

6. opendir、readdir、closedir函式

opendir函式用於開啟乙個目錄,原型如下:

#include #include dir *opendir(const char *name);
opendir返回值是乙個dir型別的指標,即所謂的"directory stream",供後續函式使用。

而readdir函式用於讀取乙個目錄,原型如下:

#include struct dirent *readdir(dir *dirp);
其中的dirp指標即是opendir的返回值,每呼叫一次readdir函式,dirp指標將指向下乙個待讀取的"directory entry",如果已經讀取到"directory stream"的末尾或者出錯,將返回乙個null指標。

再來看看readdir返回值struct dirent,結構體定義如下:

struct dirent ;

closedir函式用於關閉"directory stream",原型如下:

#include #include int closedir(dir *dirp);

好吧,來看乙個例項,將乙個目錄中的所有檔案列舉出來:

#include #include #include #include int main(int argc, char *argv)

for (;;)

closedir(dir);

return 0;

}

#include int stat(const char *path, struct stat *buf);

int fstat(int fd, struct stat *buf);

int lstat(const char *path, struct stat *buf);

其中stat根據檔名來獲取檔案相關資訊。

lstat與stat類似,區別在於如果檔案屬於符號鏈結,那麼所獲取的資訊是符號鏈結本身,而不是符號鏈結所指向的檔案。

fstat則是根據乙個開啟檔案的檔案描述符來獲取檔案相關資訊。

而上述系統呼叫都會將所獲取的檔案資訊儲存在struct stat指標所指向的緩衝區中,struct stat型別定義如下:

struct stat ;
這裡只針對部分成員加以描述。

st_mode:檔案的型別與許可權,st_mode總共16位,其中高4位為檔案的型別,可以通過巨集s_isreg()、s_isdir()等相關巨集來判斷是普通檔案、目錄檔案等。而低12位則是檔案許可權位,這裡只要知道低9位就是我們常見的例如777就可以了。

st_uid:檔案所屬使用者的id。

st_gid:檔案所屬組的id。

st_size:檔案大小。

st_atime:對應檔案的最後訪問時間。

st_mtime:對應檔案的最後修改時間。

st_ctime:對應檔案的狀態發生改變時間。

好了,了解了這些,來看乙個例項:

#include #include #include #include int main(int argc, char *argv)

printf( "mode \t\t%o\n"

"uid \t\t%d\n"

"gid \t\t%d\n"

"size \t\t%d\n"

"blocksize \t%d\n"

"blocks \t\t%d\n" , sb.st_mode, sb.st_uid, sb.st_gid,

(int)sb.st_size, (int)sb.st_blksize, (int)sb.st_blocks);

printf( "atime \t\t%s", ctime(&sb.st_atime));

printf( "mtime \t\t%s", ctime(&sb.st_mtime));

printf( "ctime \t\t%s", ctime(&sb.st_ctime));

exit(exit_success);

}

2. 改變檔案屬主

可以通過chown、fchown系統呼叫來改變檔案屬主,原型如下:

#include int chown(const char *path, uid_t owner, gid_t group);

int fchown(int fd, uid_t owner, gid_t group);

3. 改變檔案許可權

改變檔案許可權可以通過chmod、fchmod系統呼叫,原型如下:

#include int chmod(const char *path, mode_t mode);

int fchmod(int fd, mode_t mode);

4. 關於umask

先來看一段**:

#include #include int main(int argc, char *argv)

return 0;

}

這段**是新建乙個目錄,目錄的許可權是0777,但是呢,**執行之後,結果並不是所預期的那樣,建立的目錄許可權為0775,這是什麼原因呢,那就是同這裡的umask有關。

umask用於open、mkdir這類系統呼叫建立檔案或目錄的許可權掩碼,用於遮蔽一些許可權位,許可權計算公式如下:

(mode & ~umask & 0777)

通常umask預設值為0022,其含義是對於同組或其他使用者,應遮蔽寫許可權。假設呼叫mkdir建立乙個目錄,其mode為0777,那麼建立的目錄許可權實際為0755。

可以通過umask()系統呼叫來改變這個掩碼值,原型如下:

#include mode_t umask(mode_t mask);
對於上面**只需要作出如下修改,建立的目錄許可權就是我們想要的0777,**如下:
#include #include int main(int argc, char *argv)

return 0;

}

那麼我想獲取系統預設的掩碼值,怎麼獲取呢?可以通過下面的方式:
mode_t getumask(void)

使用umask系統呼叫會返回之前的掩碼值,那麼呼叫getumask一下,當前我的系統掩碼值為0002,所以最終建立的目錄許可權為0775,這就能理解為什麼指定0777許可權而得到0775許可權的原因了。

linux網路程式設計相關

一 設定socket收發超時時間 struct timeval timeout 3s int ret setsockopt sock fd,sol socket,so sndtimeo,constchar timeout,sizeof timeout int ret setsockopt sock ...

檔案程式設計相關函式(一)

1.creat 建立檔案或建立檔案 函式原型 int creat const pathname,mode t mode 函式入參 pathname 要建立的檔案路徑字串 home hello.c mode 建立檔案的許可權 函式的返回值 成功返回檔案描述符,出錯返回 1 標頭檔案 include i...

linux 稀疏檔案相關

1.用dd建立乙個檔案 dd if dev zero of mnt test bs 4096 count 1 oflag direct 2.用stat 檢視檔案的詳細資訊 size表示的是檔案的邏輯大小,這裡是4k。blocks表示的物理檔案的大小 blocks 512 8 512 4096,也就是...