您好,登錄后才能下訂單哦!
借鑒https://blog.csdn.net/lf_2016/article/details/54587020
系統(tǒng)調(diào)用:用戶直接調(diào)用操作系統(tǒng)暴露出來的接口,這種方式成為系統(tǒng)調(diào)用。
文件I/O操作就是系統(tǒng)調(diào)用, man手冊,man 2 就是查詢系統(tǒng)調(diào)用API,
常用的API有open close read write lseek fcntl
庫函數(shù)調(diào)用:對操作系統(tǒng)暴露出來的接口進(jìn)行封裝形成了庫函數(shù),提供給用戶調(diào)用。
標(biāo)準(zhǔn)文件I/O操作就是庫函數(shù)調(diào)用,man手冊,man 3 就是查詢庫函數(shù)接口。
常見的標(biāo)準(zhǔn)庫函數(shù)fopen fread fwrite
實際上庫函數(shù)是對系統(tǒng)調(diào)用的一層封裝,因此庫函數(shù)對文件操作的時候,必然會引起系統(tǒng)調(diào)用。也就是說,庫函數(shù)調(diào)用實際上是通過系統(tǒng)調(diào)用實現(xiàn)的。例如:C庫函數(shù)fwrite就是通過write實現(xiàn)的。
庫函數(shù)調(diào)用可以大大減少系統(tǒng)調(diào)用的次數(shù),這是因為緩沖區(qū)技術(shù)。在用戶空間和內(nèi)核空間,對文件都使用了緩沖區(qū),當(dāng)內(nèi)核緩沖區(qū)寫滿之后或?qū)懡Y(jié)束之后才將內(nèi)核緩沖區(qū)內(nèi)容寫到文件對應(yīng)的硬件媒介中。
#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 若文件不存在,則創(chuàng)建一個新的文件,并用第三個參數(shù)為其設(shè)置權(quán)限。 O_TRUNC 若文件已經(jīng)存在,那么會刪除文件中的全部原有數(shù)據(jù),并且設(shè)置文件大小為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開始的緩沖區(qū)中count個字節(jié) 返回值:成功時返回寫入的字節(jié)數(shù)(若為零則表示沒有寫入數(shù)據(jù)) 失敗時返回-1,并設(shè)置errno為相應(yīng)值。
#include <unistd.h> ssize_t read(int fd,void *buf,size_t count); 功能:從文件描述符fd中讀取count字節(jié)的數(shù)據(jù)并放入buf開始的緩沖區(qū)中。 返回值:成功時返回讀取到的字節(jié)數(shù) 失敗時返回-1,并設(shè)置errno為相應(yīng)值。
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); /** *offset:相對與基準(zhǔn)點whence的偏移量,以字節(jié)為單位,正數(shù)表示向前移動,復(fù)數(shù)表示向后移動 *whence:SEEK_SET 文件的起始位置 SEEK_CUR 文件當(dāng)前讀寫位置 SEEK_END 文件的結(jié)束位置 **/ 返回值:成功時,定位到文件當(dāng)前讀寫位置 失敗時,返回-1,并設(shè)置errno為相應(yīng)值
#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); }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。