#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
函數中的oflag參數說明。網絡
#include <fcntl.h> int creat(const char *path, mode_t mode); 返回值:若成功,返回只寫打開的文件描述符;若出錯,返回-1 該函數等於: int open(const char *path, O_WRONLY | O_CREAT | O_TRUNC, mode);
#include <unistd.h> int close(int fd); 返回值:若成功,返回0;若出錯,返回-1
關閉一個文件時還會釋放該進程加在該文件上的全部記錄鎖。當一個進程終止時,內核自動關閉它全部的打開文件。不少程序利用了這一功能而不顯式地用close關閉打開的文件。異步
#include <unistd.h> off_t lseek(int fd, off_t offset, int whence); off_t爲帶符號整形 返回值:若成功,返回新的文件偏移量;若出錯,返回-1
參數offset的解釋與whence的值有關。async
若是文件描述符指向的是一個管道、FIFO或網絡套接字,則lseek返回-1,並將errno設置爲ESPIPE。函數
#include <unistd.h> ssize_t read(int fd, void *buf, size_t nbytes); 返回值:讀到的字節數,若已到文件尾,返回0。若出錯,返回-1
有多種狀況可能使讀到的字節數少於要求讀的字節數。測試
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t nbytes); 返回值:若成功,返回已寫的字節數;若出錯,返回-1
#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
#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
當咱們向文件寫入數據時,內核一般先將數據複製到緩衝區中,而後排入隊列,晚些時候再寫入磁盤。這種方式被稱爲延遲寫(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函數能夠改變已經打開文件的屬性。
#include <fcntl.h> int fcntl(int fd, int cmd, ... /* int arg */); 返回值:若成功,則依賴於cmd;若出錯,返回-1
fcntl函數有如下5中功能。
#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命令。