POSIX標準與目錄管理

2021-06-29 14:54:38 字數 2777 閱讀 6845

在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...