POSIX檔案及目錄管理
在linux作業系統中,實現了兩類對檔案IO的管理,一類是遵循POSIX標準,linux作業系統自身提供的IO系統呼叫,如open、close、read等函式;另一類是由ANSI標準提供的標準IO庫函式,這些函式是對直接IO系統呼叫的封裝,其在訪問檔案時根據需要設定了不同型別的緩衝區,從而減少了直接IO系統呼叫的次數,提高訪問效率。
1、 檔案流與檔案描述符的區別:
使用ANSI C函式fopen開啟的檔案對應一個流檔案,任何程序在執行的時候,都預設打開了3個流物件。對於使用者空間來說,任何開啟的檔案都將被分配一個唯一非整數,用於標識該開啟檔案,該值即檔案描述符。
2、 檔案描述符與檔案流的轉換操作:
Linux為使用者層提供了函式fileno()以從檔案流中讀取其檔案描述符,即獲得struct FILE的_fileno成員
Int fileno (FILE *_stream) 此函式以某個流物件為引數,返回該流的檔案描述符值。
FILE *fdopen(int _fd,_const char *_modes) 此函式第一個引數為一個檔案描述符,第2個引數為封裝該流的許可權。
3、 POSIX標準下檔案IO管理:
1)、開啟檔案
Int open(_const char *file,int _oflag,…) 第1個引數為欲開啟檔案的路徑,第2個引數為開啟檔案的方式,第3個引數可有可無,自動建立該檔案,它規定了檔案的許可權。
2)、關閉檔案
Int close(int _fd)關閉檔案,將相應的內容全部寫回檔案中,即讓資料寫回磁碟。
3)、建立檔案
Int creat(_const char *_file,_mode_t _mode) 第1個引數為欲建立檔案的路徑,第2個引數為該檔案的訪問許可權。
4)、檔案控制
Int fcntl(int _fd,int _cmd) 第1個引數fd為欲修改屬性的檔案描述符,第2個引數cmd為相應的操作,常用命令如下:
#define F_DUPFD 0 //複製檔案描述符
#define F_GETFD 1 //獲得檔案描述符標誌
#define F_SETFD 2 //設定檔案描述符標誌
#define F_GETFL 3 //獲取檔案狀態
#define F_SETFL 4 //設定檔案狀態
5)、讀檔案內容
Ssize_t read (int _fd,void *_buf,size_t _nbytes)
從引數fd所指的檔案中讀取_nbytes資料到buf指標所指的記憶體中。
6)、寫內容到檔案
Ssize_t write (int _fd , _const void *_buf , size_t _n)
將buf為起始地址的緩衝區前n個位元組寫入與開啟檔案描述符fd關聯的檔案內。
7)、檔案定位
_off_t lseek(int _fd , _off_t _offset , int _whence)
第1個引數為已經開啟的檔案,第2個引數offset為位移數,第3個引數為參考點。
8)、同步核心緩衝區
為了保證磁碟上實際檔案系統與快取中的內容的一致性,sync、fsync和fdatasync系統呼叫可以更新緩衝區。
Void sync(void) 將所有修改寫的塊的快取排入寫佇列,然後返回,不等待實際IO操作結束。
Int fsync(int fildes) 等待IO結束,然後返回,多用於於資料庫相關的應用程式,它確保修改過的塊立即寫到磁碟上。
Int fdatasync(int fildes) 只更新內容。
4、 目錄檔案基本操作
1)、開啟目錄檔案
DIR *opendir(const char *dirname) 開啟路徑為dirname 的目錄,並使一個目錄流與它相關聯。
2)、關閉目錄檔案
int closedir(DIR *dirp) 關閉指定的目錄流,然後釋放與DIR指標關聯的結構
3)、讀目錄內容
Struct dirent *readdir(DIR *dirp) 讀取該目錄下的檔案列表,該函式的返回型別為struct dirent。
Int readdir_r (DIR *dirp ,struct dirent *entry, struct dirent **result) 實現多執行緒讀取目錄內容操作
4)、定位目錄位置
Long int telldir(DIR *dirp) 目錄流相關聯的當前位置
Void seekdir(DIR *dirp , long int loc) 類似於檔案定位函式fseek(),在目錄流上設定下一個readdir()操作的位置。
5)、新增刪除目錄
Int mkdir(_const char *_path, _mode_t _mode) 第1個引數為欲建立的目錄檔案路徑,
第2個引數為該目錄的訪問許可權
Int rmdir(_const char *_path) 引數為欲刪除目錄的位置
6)、當前工作路徑操作
a)、獲取當前工作路徑
char *getcwd (char *_buf , size_t _size) //獲取當前工作路徑到buf中,
如果設定buf為NULL,getcwd()將利用malloc()獲取空間,在此情況下,由getcwd()返回的指標需要被釋放。
Char *get_current_dir_name(void) 返回當前絕對路徑
b)、修改當前工作路徑
int chdir (_const char *_path) //修改程序工作路徑,引數為目錄路徑