您好,登錄后才能下訂單哦!
借鑒https://blog.csdn.net/lf_2016/article/details/54587020
系統調用:用戶直接調用操作系統暴露出來的接口,這種方式成為系統調用。
文件I/O操作就是系統調用, man手冊,man 2 就是查詢系統調用API,
常用的API有open close read write lseek fcntl
庫函數調用:對操作系統暴露出來的接口進行封裝形成了庫函數,提供給用戶調用。
標準文件I/O操作就是庫函數調用,man手冊,man 3 就是查詢庫函數接口。
常見的標準庫函數fopen fread fwrite
實際上庫函數是對系統調用的一層封裝,因此庫函數對文件操作的時候,必然會引起系統調用。也就是說,庫函數調用實際上是通過系統調用實現的。例如:C庫函數fwrite就是通過write實現的。
庫函數調用可以大大減少系統調用的次數,這是因為緩沖區技術。在用戶空間和內核空間,對文件都使用了緩沖區,當內核緩沖區寫滿之后或寫結束之后才將內核緩沖區內容寫到文件對應的硬件媒介中。
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname,int flags,int perms); flags:O_RDONLY O_WRONLY O_RDWR O_CREAT 若文件不存在,則創建一個新的文件,并用第三個參數為其設置權限。 O_TRUNC 若文件已經存在,那么會刪除文件中的全部原有數據,并且設置文件大小為0 O_APPEND 以添加方式打開文件 返回值:成功返回文件描述 失敗返回-1 int fd; fd = open("test.txt",O_RDWR|O_CREAT|O_TRUNC); if(fd < 0) { perror("fail to open"); }
#include <unistd.h> int close(int fd); 返回值:成功返回0 失敗返回-1
#include <unistd.h> ssize_t write(int fd,const void *buf,size_t count); 功能:像文件描述符fd所指向的文件中寫入,從buf開始的緩沖區中count個字節 返回值:成功時返回寫入的字節數(若為零則表示沒有寫入數據) 失敗時返回-1,并設置errno為相應值。
#include <unistd.h> ssize_t read(int fd,void *buf,size_t count); 功能:從文件描述符fd中讀取count字節的數據并放入buf開始的緩沖區中。 返回值:成功時返回讀取到的字節數 失敗時返回-1,并設置errno為相應值。
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); /** *offset:相對與基準點whence的偏移量,以字節為單位,正數表示向前移動,復數表示向后移動 *whence:SEEK_SET 文件的起始位置 SEEK_CUR 文件當前讀寫位置 SEEK_END 文件的結束位置 **/ 返回值:成功時,定位到文件當前讀寫位置 失敗時,返回-1,并設置errno為相應值
#define OFFSET 10240 int read_len; lseek(fd,-OFFSET,SET_END); while((read_len = read(fd,buf,sizeof(buf))) > 0) //讀多少,寫多少 { write(fdd,buf,read_len); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。