Unix 環境高級編程
讀者:注意僅僅是記錄自己閱讀進度,堅持閱讀,沒有深度
源代碼:
http://www.libpix.org/apue/ 第二版
http://www.apuebook.com/code3e.html 第三版
第1章UNIX基礎知識
- 文件和目錄 2017年7月20日
- 系統調用和庫函數
第2章 UNIX標準話及實現
- 最大文件描述符 sysconf
第3章 文件I/O
- 引言
- 文件描述符 0 1 2
- open函數
O_TRUNC 截短爲0
文件名和路徑名截短 - create函數
- close函數
內核自動關閉 - lseek函數
錯誤-1
od -c file.hole - read 函數
- write
常見原因:磁盤已滿,超過文件限制 - I/O 效率
Linux ext2 塊長4096 - 文件共享
進程表(記錄項)–文件表描述符(狀態,讀寫、標誌)–v節點(屬性)
多個進程寫入一個文件 - 原子操作
將多個進程寫入操作合併爲一個步驟。 - dup和dup2函數
複製文件描述符
另外一種方法fcntl(filedes,F_DUPFD,0)
與fcntl不同的地方,dup2是原子操作,以及errno不同 - sync、fsync和fdatasync函數
保證磁盤上的文件和緩衝區高速緩存內容的一致性。
sync(int files) 修改過,然後沖洗緩衝區,排入寫隊列 - fcntl函數
注意 記錄鎖時是一個指針
文件描述符標誌
文件狀態標誌 F_SETFL O_ - ioctl函數
磁盤操作 - /dev/fd
第4章 文件和目錄
- 引言
- stat、fstat和lstat函數
- 文件類型
- 設置用戶ID和設置組ID
- 文件訪問權限
- 新文件和目錄的所有權
- access函數
- unmask函數
- chmod和fchmod函數
- 粘住位
- chown、fchown和lchown函數
- 文件長度
du -s file # 查看file空間
wc -c file #統計字符
cat file > file.copy # 填滿空洞 - 文件截短
int truncate(const char *pathname, off_t length) ftruncate()
將截短爲length - 文件系統
命名該目錄的目錄項和目錄中的.項 - link、unlink、remove和rename項
- 符號鏈接
- symlink和readlink函數
- 文件的時間
- utime函數
- mkdir和rmdir
- 讀目錄
- chdir、fchdir和getcwd函數
- 設備特殊文件
- 文件訪問權限
- 小結
stat函數,文件屬性瞭解 - 習題
unix對目錄的深度有限制嗎?
答:無,但是文件名有PATH_MAX
第5章 標準I/O庫
- 引言
細節:緩衝區分配、優化長度執行I/O - 流和FILE對象
int fwide(FILE *fp, int mode) mode 參數設定,寬定向(多字節)返回值爲正,字節定向爲負值,0表示未定向 - 標準輸入、標準輸出、標準錯誤
進程預定的三個流。 - 緩衝
- 全緩衝
malloc flush - 行緩衝
遇到換行符時
行緩衝長度固定
沖洗所有行緩衝流 - 不帶緩衝流
stderr fputs - 更改緩衝類型
void setbuf(FILE *restrict fp, char *restrict buf);
void setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size); - 沖洗流
int fflush(FILE *fp) 是該流所有未寫的數據都被傳送至內核
- 全緩衝
- 打開流
- 讀和寫流
- 非格式化I/O
- 一次一個字符
- 每次一行 fgets和fputs
- 直接I/O fread和fwrite
- 輸入函數
- 非格式化I/O
- 每次一行I/O
- fgets gets
- fputs puts
- 標準I/O的效率
二進制I/O
#include<stdio.h>
size_t fread(void *restrict ptr,size_t size, size_t nobj, FILE *restrict fp);
size_t fread(void *restrict ptr,size_t size, size_t nobj, FILE *restrict fp);
定位流
- ftell 和fseek
- ftello 和 fseeko
- fgetpos 和 fsetpos
- 格式化I/O
- 格式化輸出
printf
fprintf
sprintf在該數組的尾端自動加一個null字節,但該字節不包括在返回值中。
snprintf 顯示指定緩衝區大小,避免緩衝溢出。
vprintf(,va_list arg) 可變參數 - 格式化輸出
scanf() 同printf…
- 格式化輸出
- 實現細節
調用dup或者fcntl 函數將要調用int fileno(FILE *fp) - 臨時文件
char *tmpname(char *ptr) #創建一個與現有文件名不相同的現有路徑名
FILE *tmpfile(void) #臨時文件庫,關閉該文件或程序自動刪除 - 標準I/O的替代軟件
- 效率不高 兩次複製
內核與標準I/O之間
標準I/O與用戶程序的行緩衝之間
mmap—映射文件
- 效率不高 兩次複製
- 小結
I/O緩衝技術