天天看點

第十章I/O系統級i/o

系統級i/o

開始程序時的三個标準:

标準輸入(描述符0):STDIN_FILENO

标準輸出(描述符1):STDOUT_FILENO

标準錯誤(描述符2):STDERR_FILENO

檔案位置:

從檔案開頭起始的位元組偏移量k。應用程式能夠通過執行seek操作,顯式設定檔案目前位置

open函數參數 :

基本格式:open(char *file, int flags,mode_t mode)

file:

檔案名帶雙引号表示

flags:

O_RDONLY:隻讀

O_WRONLY:隻寫

O_RDWR:可讀可寫

mode:

指定新檔案的通路權限位,與後面的umask函數互用定義,在建立新檔案利用

umask:

在打開檔案前使用函數umask(umask)進行設定,參數可以先定義

傳回值:

所在描述表的位置數值(int),出錯為-1

注意事項:

可以定義各項參數值,隻要帶有頭檔案即可,具體執行個體後面練習有參考

read and whrite讀和寫檔案:

基本格式:read/write(int fd,const void *buf, size_t n)

fd:

源檔案的描述符

n:

拷貝最多n個位元組

buf:

目标存儲器位置

傳回:

若成功則為實際傳送的位元組數量;-1表示錯誤;0表示EOF

特别情況:

讀時遇到EOF:不足值表示為0

從終端讀文本行:行不足值等于文本行大小

讀和寫網絡套接字:網絡不足值表示

RIO包健壯包利用:

RIO包會自動處理不足值。RIO提供了兩類不同的函數:

1 無緩沖的輸入輸出函數:

這些函數直接在存儲器和檔案之間傳送資料,沒有應用級緩沖,他們對将二進制資料讀寫到網絡和從網絡讀寫二進制資料尤其有用

2 帶緩沖的輸入函數:

這些函數允許你高效地從檔案中讀取文本行和二進制資料,這些檔案的内容緩存在應用級緩沖區内,類似于像printf這樣的标準I/O函數提供的緩沖區。

是線程安全的,它在同一個描述符上可以被交錯地調用。例如,可以從一個描述符中讀一些文本行,然後讀取一些二進制資料,接着再多讀取一些文本行。

stat/fstat讀取檔案中繼資料

基本格式:int stat(const filename, struct stat buf)/ int fstat(int fd, struct *buf);

stat以檔案名為輸入,fstat以檔案描述符為輸入

傳回:成功為0;出錯為-1

共享檔案 

父子程序共享檔案:子程序會有一個父程序描述符表項的副本,父子程序打開相同的檔案表集合,共享相同的檔案位置。在核心删除相應的檔案表表項之前,父子程序都必須關閉相應的描述符表項。

檔案表:目前檔案位置,引用計數(目前指向該表項的描述符項數),以及一個指向V-node表對應表項的指針

v-node表:包括st_mode和st_size成員

重定向

dup2函數:

基本格式:int dup2(int oldfd,int newfd)

功能描述:dup2函數拷貝描述符表表項oldfd到描述符表表項newfd,覆寫描述表表項newfd以前的内容。如果newfd已經打開,dup2會在拷貝oldfd之前關閉newfd

注意事項:在調用函數時舊檔案沒有引用

練習:

練習1

第十章I/O系統級i/o

練習2:

第十章I/O系統級i/o
第十章I/O系統級i/o

練習3:

第十章I/O系統級i/o

練習5:

第十章I/O系統級i/o
第十章I/O系統級i/o

練習總結:

實驗操作全是檔案操作函數,要利用檔案的建立的基礎上完成操作

實驗的參數格式要标準

練習依賴于以往學習的堆棧

練習遇到的問題以及解決的方法:

問題:沒有頭檔案,或頭檔案錯誤

方法:練習的頭檔案并沒有被複寫,可以自己加入一些必要的頭檔案或者自己複寫頭檔案

參考資料:

課本

轉載于:https://www.cnblogs.com/chuishi/p/4947924.html