沒有緩衝的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