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位的虛擬機器系統進行測試。本文介紹的命令都會在...