在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標準小結
1.posix posix 表示可移植作業系統介面 portable operating system inte ce 縮寫為 posix posix標準定義了作業系統應該為應用程式提供的介面標準,是ieee為要在各種unix作業系統上執行的軟體而定義的一系列api標準的總稱,其正式稱呼為ieee ...
Posix標準IPC筆記 1
1 usr src include 下的 errno.h 標頭檔案下宣告了乙個全域性變數 errno 每乙個unix函式在發生錯誤時都會設定 errno 在多執行緒環境下,每乙個執行緒擁有自己的errno變數。2 為了便於移植,posix ipc名字必須以斜槓符開頭,並且不能再含有其他任何斜槓符。i...
POSIX標準的檔案操作
posix是可移植作業系統介面,並不侷限於unix,是一組作業系統呼叫的規範。posix檔案操作的函式基本上是和計算機裝置驅動的底層操作一一對應的。讀者可以把posix檔案操作理解為對裝置驅動操作的封裝。主要包括以下函式 include 包含基本系統資料型別 include 包含檔案狀態 inclu...