系統級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
練習2:
練習3:
練習5:
練習總結:
實驗操作全是檔案操作函數,要利用檔案的建立的基礎上完成操作
實驗的參數格式要标準
練習依賴于以往學習的堆棧
練習遇到的問題以及解決的方法:
問題:沒有頭檔案,或頭檔案錯誤
方法:練習的頭檔案并沒有被複寫,可以自己加入一些必要的頭檔案或者自己複寫頭檔案
參考資料:
課本
轉載于:https://www.cnblogs.com/chuishi/p/4947924.html