常用的文件操作接口
文章目錄
- 1 文件描述符和打開模式
- 1.1 文件描述符
- 1.2 文件打開模式
- 2 open
- 3 close
- 4 read
- 5 write
- 6 lseek
- 7 sync
- 8 標準IO函數(shù)
1 文件描述符和打開模式
1.1 文件描述符
文件描述符fd:
- 是一個>=0的整數(shù)。
- 每打開一個文件,就創(chuàng)建一個文件描述符,通過文件描述符來操作文件。
預定義的文件描述符:
- 0:標準輸入,對應于已打開的標準輸入設備(鍵盤)
- 1:標準輸出,對應于已打開的標準輸出設備(控制臺)
- 2:標準錯誤, 對應于已打開的標準錯誤輸出設備(控制臺)
多次打開同一個文件,可得到多個不同的文件描述符。
fd本質為特殊的索引,實際上就是進程中file_struct結構體成員fd_array的數(shù)組下標。
1.2 文件打開模式
主模式:
- O_RDONLY:只讀模式
- O_WRONLY:只寫模式
- O_RDWR:讀寫,模式
副模式:
- O_CREAT:當文件不存在,需要去創(chuàng)建文件
- O_APPEND:追加模式
- O_DIRECT:直接IO模式
- O_SYNC:同步模式
- O_NOBLOCK:非阻塞模式
- O_EXCL:如果同時使用O_CREAT而且該文件又已經存在時,則返回錯誤, 用途:以防止多個進程同時創(chuàng)建同一個文件
- O_TRUNC:若文件存在,則長度被截為0,屬性不變
2 open
頭文件:
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>函數(shù)原型:
-
當文件存在時
int open(const char* pathname,int flags) -
當文件不存在時
int open (const char* pathname,int flags,int perms)
上面的兩個函數(shù)實際上是使用可變參數(shù)。
當其第二個參數(shù)含有O_CREAT 時,第三個參數(shù)才有效。表示的是當使用open系統(tǒng)調用創(chuàng)建一個文件時,其文件的訪問權限是多少,第三個參數(shù)可以指定為0755,0644等,也可以用系統(tǒng)提供的宏:S_IRWXU、S_IRUSR等代替,一個作用。
返回值:
- 成功:文件描述符
- 失敗:-1
注意:返回的文件描述符是該進程未打開的最小的文件描述符。
3 close
頭文件:
#include <unistd.h>函數(shù)原型:
int close(int fd)返回值:
- 成功:0
- 失敗:-1
4 read
頭文件:
#include <unistd.h>函數(shù)原型:
ssize_t read(int fd,void *buff,size_t count) // ssize_t是有符號數(shù)返回值:
成功:
- count:成功讀取全部字節(jié)
- 0~count:
- 剩余文件長度小于count
- 讀取期間被異步信號打斷
失敗:
- -1,讀取錯誤
5 write
頭文件:
#include <unistd.h>函數(shù)原型:
ssize_t write(int fd,void *buff,size_t count)返回值:
成功:
- count:成功寫入全部字節(jié)
- 0~count:
- 寫入期間被異步信號打斷
失敗:
- -1,讀取錯誤
復制普通文件小實驗:
1、打開要復制的文件
2、創(chuàng)建新的文件
3、把源文件內容讀到緩沖區(qū),把緩沖區(qū)內容寫入新文件
4、循壞執(zhí)行第三步,直到讀取的字節(jié)數(shù)量為0,退出循壞。
5、關閉打開的文件
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h>int main(int argc, char* argv[]) {int fd1 = -1, fd2 = -1;int read_len = 0;char buffer[512] = {0};if (argc != 3){printf("error usage !\n");return -1;}fd1 = open(argv[1], O_RDONLY);fd2 = open(argv[2], O_WRONLY | O_CREAT, 0666);if ((fd1 < 0) || (fd2 < 0)){close(fd1);close(fd2);printf("open file error!\n");return -1;}while (1){read_len = read(fd1, buffer, sizeof(buffer));if (read_len <= 0){break;}write(fd2, buffer, read_len);}close(fd1);close(fd2);return 0; }6 lseek
功能:
- 設置文件讀寫位置
頭文件:
#include <unistd.h>函數(shù)原型:
off_t lseek(int fd,off_t offset,int whence)- 若whence為SEEK_SET,基準點為文件開頭
- 若whence為SEEK_CUR,基準點為當前位置
- 若whence為SEEK_END,基準點為文件末尾
返回值:
- 成功:文件偏移位置值
- 失敗:-1
讀寫是使用的同一個位置指針。使用O_RDWR時,如果先讀了一段再寫,那么寫的位置從讀完處開始,同理先寫了一段再讀,那么讀的位置從寫完處開始。可以使用lseek來改變文件位置指針,即讀寫的位置。
7 sync
功能:
- 頁緩存和回寫,強制把修改過的頁緩存區(qū)數(shù)據(jù)寫入磁盤。
頭文件:
#include <unistd.h>函數(shù)原型:
void sync(void);返回值:
- 無
8 標準IO函數(shù)
由于系統(tǒng)文件IO函數(shù)需要在用戶態(tài)和內核態(tài)之間進行切換,所以效率比較低。標準IO則在應用層實現(xiàn)了一個緩沖區(qū),示意圖如下:
常見標準IO函數(shù):
-
fopen
-
fclose
-
fread
-
fwrite
-
fseek
-
fflush:強制把IO緩存區(qū)的數(shù)據(jù)寫入到頁緩存區(qū)
文件IO五大模式:
- 阻塞模式
- 非阻塞模式
- IO多路復用
- 異步IO
- 信號驅動IO
參考資料:
總結
- 上一篇: Makefile实例分析
- 下一篇: yoga2怎么进入u盘启动 Yoga2如