Linux 文件I/O

函數open和openat

#include <fcntl.h>

int open(const char *path, int oflag, ... /* mode_t mode */);
int openat(int fd, const char *path, int oflag, ... /* mode_t mode */);

兩個函數的返回值:若成功,返回文件描述符;若出錯,返回-1

fd參數把open和openat函數區分開,共有三種可能性。ios

  1. path參數指定的是絕對路徑,在這種狀況下,fd參數被忽略,openat函數就至關於open函數。
  2. path參數指定的是相對路徑,fd參數指出了相對路徑名在文件系統中的開始地址。fd參數是經過打開相對路徑名所在的目錄來獲取。
  3. path參數指定了相對路徑,fd參數具備特殊值AT_FDCWD。在這種狀況下,路徑名在當前工做目錄中獲取,openat函數在操做上與open函數相似。

函數中的oflag參數說明。網絡

  • O_RDONLY 只讀打開。
  • O_WRONLY 只寫打開。
  • O_EXEC 只執行打開。
  • O_SEARCH 只搜索打開(應用於目錄)。
  • O_APPEND 每次寫時都追加到文件的尾端。
  • O_CLOEXEC 把FD_CLOEXEC常量設置爲文件描述符標誌。
  • O_CREAT 若此文件不存在則建立它。使用此選項時,open函數須要同時說明第三個參數mode,用mode指定該新文件的訪問權限位。
  • O_EXCL 若是同時指定了O_CREAT,而文件已經存在,則出錯。用此能夠測試一個文件是否存在,若是不存在,則建立此文件,這使測試和建立二者成爲一個院子操做。
  • O_NOCTTY 若是path引用的是終端設備,則不將該設備分配做爲此進程的控制終端。
  • O_NOFOLLOW 若是path引用的是一個符號連接,則出錯。
  • O_NONBLOCK 若是path引用的是一個FIFO、一個塊特殊文件或一個字符特殊文件,則此選項爲文件的本次打開操做和後續的I/O操做設置非阻塞方式。
  • O_SYNC 使每次write等待物理I/O操做完成,包括由該write操做引發的文件屬性更新所需的I/O。
  • O_TRUNC 若是此文件存在,並且爲只寫或讀寫成功打開,則將其長度截斷爲0。
  • O_TTY_INIT 若是打開一個還未打開的終端設備,設置非標準termios參數值,使其符合Single UNIX Specification。
  • O_DSYNC 使每次write要等待物理I/O操做完成,可是若是該寫操做並不影響讀取剛寫入的數據,則不須要等待文件屬性被更新。
  • O_RSYNC 使每個以文件描述符做爲參數進行的read操做等待,直至全部對文件同一部分掛起的寫操做都完成。

函數creat

#include <fcntl.h>

int creat(const char *path, mode_t mode);

返回值:若成功,返回只寫打開的文件描述符;若出錯,返回-1

該函數等於:

int open(const char *path, O_WRONLY | O_CREAT | O_TRUNC, mode);

函數close

#include <unistd.h>

int close(int fd);

返回值:若成功,返回0;若出錯,返回-1

關閉一個文件時還會釋放該進程加在該文件上的全部記錄鎖。當一個進程終止時,內核自動關閉它全部的打開文件。不少程序利用了這一功能而不顯式地用close關閉打開的文件。異步

函數lseek

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

off_t爲帶符號整形

返回值:若成功,返回新的文件偏移量;若出錯,返回-1

參數offset的解釋與whence的值有關。async

  • 若whence是SEEK_SET,則將該文件的偏移量設置爲距文件開始處offset個字節。
  • 若whence是SEEK_CUR,則將該文件的偏移量設置爲其當前值加offset,offset可爲正或負。
  • 若whence是SEEK_END,則將該文件的偏移量設置爲文件長度加offset,offset可爲正或負。

若是文件描述符指向的是一個管道、FIFO或網絡套接字,則lseek返回-1,並將errno設置爲ESPIPE。函數

函數read

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t nbytes);

返回值:讀到的字節數,若已到文件尾,返回0。若出錯,返回-1

有多種狀況可能使讀到的字節數少於要求讀的字節數。測試

  • 讀普通文件時,在讀到要求字節數以前已經達到了文件尾端。
  • 當從終端設備讀時,一般一次最多讀一行。
  • 當從網絡讀時,網絡中的緩衝機制可能形成返回值小於所要求讀的字節數。
  • 當從管道或者FIFO讀時,若是管道包含的字節少於所需的數量,則read將只返回實際可用的字節數。
  • 當從某些面向記錄的設備(如磁帶)讀時,一次最多返回一個記錄。
  • 當被信號中斷,而已經讀取了部分數據時。

函數write

#include <unistd.h>

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

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

原子操做函數pread和pwrite

#include <unistd.h>

ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);
返回值:讀到的字節數,若已到文件尾,返回0;若出錯,返回-1

ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);
返回值:若成功,返回已寫的字節數;若出錯,返回-1

調用pread至關於調用lseek後調用read,可是pread又與這種順序調用有區別(調用pwrite與調用pread相同)。spa

  • 調用pread時,沒法中斷其定位和讀操做。
  • 不更新當前文件偏移量。

函數dup和dup2

#include <unistd.h>

int dup(int fd);
int dup2(int fd, int fd2);

兩個函數的返回值:若成功,返回新的文件描述符;若出錯,返回-1

由dup返回的文件描述符必定是當前可用文件描述符中的最小數值。對於dup2,能夠用fd2參數指定新文件描述符。若是fd2已經打開,則先將其關閉。若是fd等於fd2,則dup2返回fd2,而不關閉它。不然,fd2的FD_CLOEXEC文件描述符標誌被清除,這樣fd2在進程調用exec時是打開狀態。code

函數sync, fsync, fdatasync

當咱們向文件寫入數據時,內核一般先將數據複製到緩衝區中,而後排入隊列,晚些時候再寫入磁盤。這種方式被稱爲延遲寫(delayed write)。爲了保證磁盤上實際文件與緩衝區中內容的一致性,UNIX提供了sync,fsync和fdatasync三個函數。隊列

#include <unistd.h>

int fsync(int fd);
int fdatasync(int fd);
返回值:若成功,返回0;若出錯,返回-1

void sync(void);

sync只是將全部修改過的塊緩衝區排入寫隊列,而後返回,它並不等待實際的寫磁盤操做結束。進程

fsync函數只對文件描述符fd指定的一個文件起做用,而且等待寫磁盤操做結束才返回。

fdatasync函數相似於fsync,但它隻影響文件的數據部分。fsync還會同步更新文件的屬性。

函數fcntl

fcntl函數能夠改變已經打開文件的屬性。

#include <fcntl.h>

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

返回值:若成功,則依賴於cmd;若出錯,返回-1

fcntl函數有如下5中功能。

  1. 複製一個已有的描述符(cmd = F_DUPFD或F_DUPFD_CLOEXEC)。
  2. 獲取或設置文件描述符標誌(cmd = F_GETFD或F_SETFD)。
  3. 獲取或設置文件狀態標誌(cmd = F_GETFL或F_SETFL)。
  4. 獲取或設置異步I/O全部權(cmd = F_GETOWN或F_SETOWN)。
  5. 獲取或設置記錄鎖(cmd = F_GETLK, F_SETLK或F_SETLKW)。

函數ioctl

#include <unistd.h>  /* System V */
#include <sys/ioctl.h>  /* BSD and Linux */

int ioctl(int fd, int request, ...);

返回值:若出錯,返回-1;若成功,返回其餘值

在此原型中,咱們表示的只是ioctl函數自己所要求的頭文件。一般,還要求另外的設備專用頭文件。例如,終端I/O的ioctl命令都須要頭文件<termios.h>。每一個設備驅動程序能夠定義本身專用的一組ioctl命令,系統則爲不一樣類型的設備提供通用的ioctl命令。

相關文章
相關標籤/搜索