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)??//修改進程工作路徑,參數為目錄路徑
總結
以上是生活随笔為你收集整理的POSIX文件及目录管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断目录是否存在并创建mkdir
- 下一篇: Program terminated w