一、五個函數:
open/read/write/lseek/close
二、文件描述符
對內核而言,每個打開文件都是通過文件描述符(其實就是一個非負整數)引用。慣例0標準輸入、1標準輸出、2標準出錯
三、open函數
打開或者創建文件
#include<fcntl.h>
int open(const char *pathname, int oflag, …/*mode_t mode*/)
返回值:成功返回文件描述符,出錯返回-1;返回的一定是最小未用的描述符
oflag:O_RDONLY O_WRONLY O_RDWR
可選:O_APPEND;O_CREAT; O_EXCL; O_TRUNC; O_NOCTTY; O_NONBLOCK
四、creat函數
創建文件
#include<fcntl.h>
int creat(const char *pathname, mode_t mode)
返回值:成功返回只寫打開的文件描述符,出錯返回-1;
等效於open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode)
五、close函數
關閉一個打開的文件
#include<unistd.h>
Int close(int filedes)
返回值:成功返回0,出錯返回-1
關閉文件時,進程會釋放加在該文件上的記錄鎖
進程結束是會釋放掉所有打開的文件
六、lseek函數
每個打開的文件都有一個當前文件偏移量(current file offset)——從文件開始處的字節數
#include<unistd.h>
off_t lseek(int filedes, off_t offset, int whence)
返回值:成功返回新的文件偏移量,出錯-1;
whence:SEEK_SET; SEEK_CUR; SEEK_END
(負文件偏移量)
七、read函數
從打開的文件讀數據
#include<unistd.h>
ssize_t read(int filedes, void *buf, size_t nbytes)
返回值:成功返回讀取的字節數,已到文件結尾0,錯誤-1;
八、write函數
向打開的文件寫數據
#include<unistd.h>
ssize_t write(int filedes, const void *buf, size_t nbytes)
返回值:成功返回已寫的字節數,出錯-1;
寫成功後,文件偏移量增加實際寫的字節數。
九、文件共享
對於已經打開的文件,內核有三種數據結構表示它:
每個進程都有個進程表項
(1) 文件描述符表
文件描述符標誌
指向文件表項的指針
(2) 文件表項
文件狀態標誌
當前文件偏移量
指向v結點的指針
(3) v結點
打開文件的內核結構
兩個獨立進程打開同一個文件
每個給定文件只有一個v結點表項,而每個進程都有自己的文件表項:這種安排使每個進程都可以有自己對該文件的當前文件偏移量
十、原子操作
多個進程讀同一個文件都能正確工作,但是同時寫一個文件就會出現意想不到的結果,因爲每個進程都有自己的文件表項,裏面存有自己的當前文件偏移量。爲了避免這種情況,就需要原子操作。
#include<unistd.h>
ssize_t pread(intfiledes, void *buf, size_t nbytes, off_t offset)
返回值:成功返回讀到的字節書,到文件末尾0,出錯-1;
ssize_t pwrite(intfiledes, void *buf, size_t nbytes, off_t offset)
返回值:成功返回寫的字節數,出錯-1;
十一、dup和dup2函數
複製一個現存的文件描述符
#include<unistd.h>
int dup(int filedes)
int dup2(int filedes, intfiledes2)
返回值:成功返回新的文件描述符,出錯-1;
dup返回的一定是當前可用的最小的文件描述符,dup2是用filedes2指定新的文件描述符,如果filedes2已經打開,則先將其關閉。
十二、sync、fsync、fdatasync函數
爲了保證磁盤上實際文件系統與緩衝區高速緩存中的內容一致性
十三、fcntl函數
改變已打開文件的性質
#include<fcntl.h>
int fcntl(int filedes, intcmd, …/*int arg*/)
fcntl5種功能:
1、 複製一個現有的描述符(cmd= F_DUPFD)
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)