APUE ---I/O

 沒有緩衝的I/O

1、open函數

int open(const char *pathname, int flag, .../* mode_t mode*/)

文件打開成功返回文件描述符(非負數),失敗返回-1

flag常用的選項有:

O_RDONLY 只讀打開

O_WRONLY 只寫打開

O_RDWR   讀寫打開

以上三個選項必須指定且只能指定一個

O_APPEND 寫的時候追加在末尾

O_CREAT 文件不存在就創建它。此時需要用第三個參數mode指明權限

O_EXCL 測試文件是否存在,如果不存在就創建。測試和創建爲原子操作

O_TRUNC 如果文件存在則將其長度截斷爲0

O_NOCTTY

O_NONBLOCK

O_DSYNC

O_RSYNC

O_SYNC 使每次write都等到物理I/O操作完成

2、creat函數

int creat(cosnt char *pathname, mode_t mode);

它等效於 open(pathname, O_WRNOLY | O_CREAT | O_TRUNC, mode).

3、close函數

int close(int filedes)

可以不顯示的關閉文件,進程結束的時候會自動關閉

4、lseek函數

off_t lseek(int filedes, off_t offset, int wherece)

執行成功返回新的偏移量,失敗返回-1.

wherece的取值有:

SEEK_SET 開始處

SEEK_CUR 當前位置

SEEK_END 末尾

偏移量offset可正可負,lseek僅將當前的文件偏移量記錄在內核中,它並不引起任何I/O操作。

5、具有空洞的文件

在使用的lseek的時候,文件偏移量可以大於文件的當期的長度,這時,對文件的下一次寫時,就會在中間構成一個空洞,這個空洞不在磁盤上佔用存儲區。如圖0 那一段是空洞

as1321435

0000000

4654765887

6、read函數

ssize_t read(int filedes, void *buf ,size_t nbytes)

成功,返回讀到的字節數,若已到文件結尾則返回0,出錯返回-1

7、write函數

ssize_t write(int filedes, const void *buf, size_t nbytes)

成功:返回已寫的字節數,出錯返回-1

8、文件共享

內核使用三種數據結構表示打開的文件。

(1)文件描述符表,包括文件表述符標誌和指向文件表項的指針

(2)文件表,包括文件狀態,當前的偏移量,V節點指針。

(3)V節點表,包含文件類型和對此文件進行各種操作的函數的指針

 

當兩個獨立的進程各自打開了同一個文件的時候,每個進程都得到一個文件表項,但是V節點只有一個。

9、dup函數和dup2函數

int dup(int filedes);

int dup2(int filedes, int filedes2);

dup是複製文件描述符filedes,dup2是複製filedes,並新的文件描述符的名字改爲filedes2並關閉filedes2.

成功,返回新的文件描述符,出錯返回-1

10、sync ,fsync ,fdatasync

當將數據寫入文件時,內核通常先將數據複製到其中一個緩衝區中,知直到緩衝區寫滿才把該緩衝排入輸出隊列,然後待其到達對首時,才進行實際的I/O操作,這種輸出方式稱爲延遲寫,但是這種延遲可能會造成文件更新內容的丟失。爲了避免這種情況 unix提供了sync ,fsync ,fdatasync這三個函數。

int fsync(int filedes);

int fdatasync(int filedes);

void sync(void);

sync函數只是將所有修改過的塊緩衝區排入寫隊列,然後就返回。它並不等待實際寫磁盤操作結束。

fsync對filedes指定的單一文件起作用,並且等待寫磁盤操作結束後才返回。

fdatasync除了具備fsync的功能外還會同步更新文件的屬性。

11、fcntl函數

int fcntl(int filedes, int cmd , .../*int arg*/);

功能是改變已經打開的文件的性質,成功返回值依賴於cmd,出錯返回-1

cmd:

F_DUPFD 複製一個現有的描述符,新文件描述符作爲返回值,新描述符filedes共享同一文件表項。

F_GETFD 返回filedes的文件描述符標誌。

F_SETFD對filedes設置文件描述符標誌,新標誌位arg

F_GETFL 返回filedes的文件狀態標誌。

F_SETFL 設置文件狀態標誌,用arg傳入

F_GETOWN 取當前接受 SIGIO和SIGURG信號的進程ID或進程組ID

F_SETOWN



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章