本文參考《UNIX環境高級編程》css
1、基礎介紹。linux
1:文件的構成。shell
1,首先聲明,這裏的文件和目錄,表示普通的文件和目錄。不肯定是否能夠應用到:設備,管道等特殊形式的文件(UNIX把它們也看成文件處理)。編程
2,目錄的構成:v節點編號和文件名。緩存
1)v節點:文件系統相關的節點。文件類型,各種文件操做函數指針。但目錄中包含的是節點編號,不是節點自己。異步
3,文件的構成:v節點和i節點。async
1)i節點:文件全部者,長度,磁盤實際所在位置指針等。函數
2)linux中,沒有v節點,只有兩個i節點。一個和文件系統相關,一個無關。ui
3)連接文件的實際內容(數據塊數據)爲實際文件的文件名。spa
2:文件描述符:在進程中,用來搜索文件的索引值。
1,進程查找文件須要:記錄表,文件表,V節點表。
1)每一個進程都會有一張記錄表。文件描述符佔用記錄標中的一項。每一項會對應一個文件表的指針。
2)文件表:記錄文件狀態,當前偏移量,v節點指針。
1.文件狀態表示:讀寫,添寫,同步,阻塞...
2,經過文件描述符查找文件的流程。
1)經過文件描述符 —— 文件表 —— 找到v節點 —— 找到數據i節點。
3,描述符是數值上爲 非負整數。
3,標準輸入,標準輸出,標準錯誤一般佔用0,1,2這3個端口。不少shell和應用程序都默認支持此規則。因此若是更改此規則可能會致使系統和程序沒法使用。
文件 對應描述符 POSIX的宏(include<unistd.h>)
standard input、 0 STDIN_FILENO
standard output 1 STDOUT_FILENO standard error 2 STDERR_FILENO
4,宏OPEN_MAX 定義了最大打開文件數。描述符最大值爲:OPEN_MAX-1
2、相關操做函數。
1:函數列表。
1 打開文件 open(const char *path, int oflag, mode_t mode); openat(int fd, const char *path, int oflag, mode_t mode); // 1 fd:文件描述符。當openat函數第二參數path爲相對路徑時使用。獲得相對路徑的前置路徑。 // 2 oflag:有5個基本常量參數(不可多選),以及一些可選常量參數。 // 3 openat函數使用:可使用相對路徑來訪問文件,使函數更爲靈活。 2 建立/刪除一個文件 creat(const char *path, mode_t mode ), close( int fd ) // 1 creat函數等效於open(path, O_WRONLY| O_CREAT | O_TURNC, mode ) // 2 關閉文件時,還會釋放該進程在文件上添加的記錄鎖。 // 3 當進程結束時,內核會自動關閉關聯文件。 3 讀/寫 文件 size_t read( int fd, void *buf, size_t nbytes ); size_t write( int fd, const void *buf, size_t nbytes ); // 1 read函數中返回值爲 讀到的字數, 第二參數保存 讀到的字符的起始位置的指針。 // 2 兩個函數出錯時,返回值爲-1。 // 3 write函數僅將數據寫入緩存。寫入磁盤時間由系統控制。如指望當即寫入,須要設置:O_SYNC。 4 設置文件偏移量(針對已打開文件) lseek( int fd, off_t offset, int whence ) // 1 whence有三個選項:SEEK_SET / CUR / END 分別表示 偏移量從 開始處 / 當前爲指 / 結束點 開始。 // 2 部分操做系統默認: SEEK_SET / CUR / END 分別爲 0 / 1 / 2。 5 複製現有的文件描述符。 int dup( int fd ); int dup2( int fd, int fd2 ); // 1 須要包含"unistd.h"頭文件 // 2 複製一個現有文件描述符 到 當前最小空餘的文件描述符位。 6 將緩存區寫入磁盤 // 默認保存在緩衝區,等待內核寫入。 int sync( int fd ); // 發送寫入指令,但不等待寫返回。 int fsync( int fd ); //發送寫入指令,並等待返回。 int fdatasync( int fd ); //僅更新數據部分,不更新文件屬性。 7 設置文件屬性(針對已打開文件) int fcntl( int fd, int cmd, int arg ) // 1 複製一個已有描述符。 // 2 get/set 文件描述符/文件狀態標誌/異步IO全部權/記錄鎖。 // 3 修改 文件描述符/文件狀態標誌位時,注意先獲取,肯定正確,再賦值。防止出錯。 8 獲取文件相關信息。 int stat( const char *restrict pathname, struct stat *restrict buf ) int fstat( int fd, struct stat *restrict buf ) int lstat( const char *restrict pathname, struct stat *restrict buf ) int fstatat( int fd, const char *restrict pathname, struct stat *restrict buf, int flag ) // 1 結構體 stat 保存 文件有關的信息。 // 2 fstatat函數根據 參數flag 來決定具體做用。是上三種函數的集合體。 // 3 lstat能夠用來獲取 符號連接 類型的文件的信息。 9 檢測實際用戶/組對文件的權限。 int access( const char *pathname, int mode ) int faccssat( int fd, const char *pathname, int mode, int flag ) // 1 return : success is 0, failure is -1 // 2 一般是由於設置ID,致使有效ID和實際ID不一樣時,纔會使用。 // 3 faccessat函數的 參數flag 設置爲 AT_EACCESS 時,檢測的是有效ID 而非實際。 10 設置屏蔽字。 mode_t umask( mode_t cmask ); // 1 設置屏蔽字。進程建立一個文件時,使用此屏蔽字來肯定該文件的讀寫權限 // 2 使用四個8進制數表示。分別爲:文件類型,用戶權限,組權限,其餘組權限。 11 更改現有文件權限 int chmod( const char* pathname, mode_t mode ) int fchmod( int fd, mode_t mode ) int fchmodat( int fd, const char *pathname, mode_t mode, int flag ) // 1 flag 爲 AT_SYMLINK_NOFOLLOW時,函數不跟隨符號連接。 12 更改用戶/組ID int chown( const char *pathname, uid_t owner, gid_t group ) int fchown( int fd, uid_t owner, gid_t group ) int fchownat( int fd, const char* pathname, uid_t owner, gid_t group, int flag ) int lchown( const char* pathname, uid_ owner, gid_t group ) 13 設置文件大小。 int truncate( const char* pathname, off_t length ) int ftruncate( int fd, off_t length ) 14 增長/刪除文件連接 int link( const char* existingpath, const char* newpath) int linkat( int efd, const char* existingpath, int nfd, const char* newpath, int flag) int unlink( const char* pathname) int unlinkat( int fd, const char *pathname, int flag) int remove( const char* pathname ) // 刪除文件需求:連接計數器爲0,文件爲關閉狀態 // 1 當由進程打開文件時,文件沒法被刪除。 // 2 流程:關閉一個文件時,內核首先檢查打開文件的進程個數;若是計數爲0,內核再檢查其連接計數,若是連接計數也爲0,則刪除該文件。 // 3 該特性能夠用來保證,臨時文件不會被遺留下來。(由於進程關閉後,兩個計數都爲0)。 15 文件重命名 int rename( const char *oldname, const char* newname ) int renameat( int oldfd, const char *oldname, int newfd, const char* newname ) // 1 不能對文件 ‘.’/‘..’ 兩個文件進行重命名。 16 建立一個符號連接 int symlink(const char *actualpath, const char *sympath ) int symlinkat(const char *actualpath, int fd, const char *sympath ) 17 讀取符號連接自己 ssize_t readlink( const char *restrict pathname, char *restrict buf ) ssize_t readlinkat( int fd, const char *restrict pathname, char *restrict buf, size_t bufsize ) 18 更改文件的訪問和修改時間。 int futimens( int fd, const struct timespac time[2] ) int utimensat( int fd, const char *path, const struct timespac times[2], int flag) int utimes( const char* pathname, const struct timeval times[2] ) // 1 time參數中,第一個爲訪問時間,第二個爲修改時間。 19 建立/刪除目錄 int mkdir( const char* pathname, mode_t mode) int mkdirat( int fd, const char* pathname, mode_t mode) int rmdir( const char *pathname ) // 1 需注意,rmdir的執行規則(進程打開計數,連接計數等)。 20 更改當前工做目錄(HOME) int chdir( const char * pathname ); int fchdir( int fd ); char* getcwd( char *buf, size_t size ); //經過 相對路徑 獲得 絕對路徑。
2:歷史遺留問題:高編3章後習題沒法理解。待看完後從新嘗試解決。