溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

系統(tǒng)調(diào)用和庫函數(shù)調(diào)用

發(fā)布時間:2020-06-15 15:51:30 來源:網(wǎng)絡(luò) 閱讀:911 作者:噓123 欄目:系統(tǒng)運維

借鑒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);
}


向AI問一下細(xì)節(jié)

免責(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)容。

AI