Linux系統級IO RIO 帶緩衝區IO實現

2021-10-24 20:19:56 字數 2463 閱讀 3661

unxi系統級的io函式,在某些情況下,傳送的位元組數比使用者要求的少,會出現不足值(short count)主要原因為:

一種策略是反覆呼叫read函式,直到將所需要的位元組全部讀取完畢。另一種思路採取緩衝區方式:

帶緩衝區輸入函式:允許應用程式高效的從檔案中讀取文字和二進位制資料,避免頻繁讀取和以及解決不足問題。
rio robust io健壯io讀取包,其通過實現乙個使用者級的緩衝區來處理不足值,以及減少頻繁的系統級io的呼叫。

【rio_t】

乙個使用者級的記憶體緩衝區與乙個開啟的檔案描述符關聯:

#define rio_buffersize 8192

typedef struct rio_t;

//初始化緩衝區 關聯乙個檔案描述符fd

void rio_readinitb(rio_t* rp,int fd) //初始化乙個rio_t結構的讀緩衝區

【rio_readn rio_writen】

實現無緩衝區的讀寫,主要應用於寫入檔案:

ssize_t rio_readn(int fd,void* usrbuf,size_t n)

else if(nread==0)

break;

nleft-=nread; //將fd的資料直接傳送到使用者區

bufp+=nread;

}}ssize_t rio_writen(int fd,void* usrbuf,size_t n)

nleft-=nwritten;

bufp+=nwritten; //指標右移}}

核心函式rio_read

ssize_t rio_read(rio_t* rp,char* usrbuf,size_t n)
其基本實現思路為:

rp->rio_bufptr=rp->rio_buf;//緩衝區填充成功 重置起始指標

}cnt =n;

if(rp->rio_cntrio_cnt;//可讀的位元組數 取較小值

}memcpy(usrbuf,rp->rio_bufptr,cnt);

rp->rio_bufptr+=cnt;

rp->rio_cnt-=cnt;//可讀位元組數減少

return cnt;//返回讀取成功的位元組數

}由此可見rio_read和linux系統級的read函式具有類似的含義。出錯時,返回-1.在遇到eof時,返回不足值0 。

基於rio_read的帶緩衝區實現,可以進一步實現:

ssize_t rio_readlineb(rio_t *rp,void* usrbuf,sszie_t maxlen)
該函式讀取一行的資料,它會調研rio_read函式從rio緩衝區乙個個讀取字元,可能發生兩種情況:

//帶緩衝區版本的readline實現

ssize_t rio_readlineb(rio_t* rp,void* usrbuf,size_t maxlen)

else if(nread==0)

break;

nleft-=nread;

bufp+=nread;

}return (n-nleft);

}

【實驗與演示】

int main()

通過關聯標準的輸入到使用者級緩衝區rio

不斷的讀取行,並通過直接複製的方式io輸出到 fd開啟的檔案中:

chmod 777 rio_test.txt
rio_test.txt 的內容: 

rio是帶有使用者緩衝區的封裝實現,相較於直接呼叫read函式的優勢有以下幾點:

①:當緩衝區有可讀位元組時,直接返回相應大小的位元組,無需執行系統呼叫read ,避免陷入核心

②:當緩衝區沒有可讀位元組時,執行一次read,並且read一次申請讀取緩衝區大小的位元組,提高了訪問效率。

linux系統 入門級

通俗來講,就是一款作業系統。跟你用的windows 蘋果mac os系統 手機安卓系統一樣。區別在於,linux系統是開源的,免費的,主要運用在伺服器端。也就是公司的伺服器上。上面一般是用來跑服務的,比如web服務 dns服務 遊戲服務。這些服務程式可以為使用者提供服務,比如你玩的遊戲,大多數的服務...

linux 系統啟動流程 和linux執行級別

linux的執行級別是0 6 0 shutdown target 關機 1 emergency.target 緊急救援模式 2 rescue.target 救援模式 3 multi user target 多使用者模式 字元系統模式 4 無5 graphical.target 桌面系統 6 無 重啟...

linux系統下常用或有用的系統級命令

本文章記錄我在linux系統下常用或有用的系統級命令,包括軟硬體檢視 修改命令,有cpu 記憶體 硬碟 網路 系統管理等命令。但本文不打算介紹生僻命令,也不介紹各個linux發行版下的特有命令,且以後會持續更新。說明,我是在乙個centos 6.4 64位的虛擬機器系統進行測試。本文介紹的命令都會在...