1)檔案空洞: 讀空洞的內容結果為'/0'
lseek至超過檔案末尾,並寫資料則造成空洞。
truncate(fd)可以截短也可以生成空洞,標準未規定,系統實現不同
2) 不跟隨符號連線的函式:chown,rename,remove
3) 標準i/o:
說明:是一組庫函式,符合ansi c標準
目的:合理設定快取,提高read/write效率
如何比較fputs,fput,write,fwrite的效率?
read:取決於每次讀的字元(引數n),越大越快,但需要記憶體越多
fgets:流快取使得每次的使用者時間基本固定,但是核心時間與read的最優n相同
對固定位元組數的讀寫,所有方法對核心提出的讀寫請求相同,系統cpu時間相同
標準i/o試圖讀寫乙個塊單位的資料
3)非阻塞i/o:
對於終端、網路裝置、流裝置:read/write呼叫完成的位元組可能少於要求的位元組,正常;而對於磁碟檔案則不可以
讀寫管道和網路裝置時,如果條件不具備,讀寫可能會永遠阻塞(即不出錯返回),稱為低速呼叫。讀寫磁碟不算低速。
非阻塞處理:
設定非阻塞標誌:open(nonblock), fcntl(nonblock)
posix規定,如果阻塞,read返回-1,error = eagain,bsd返回ewouldblock
輪詢處理能夠達到功能,但是浪費了cpu時間,所以採用多路轉接技術(select)
4)記錄鎖
posix支援fcntl
分為讀鎖和寫鎖:
如果不可加鎖,有阻塞和不阻塞兩種模式
鎖與i_node和程序相關,i_node裡有乙個lock列表,每個lock項都有程序id
建議鎖和強制鎖:
建議鎖由程序自己控制加解鎖,如建立乙個鎖檔案,程序協同讀檔案的加鎖和解鎖 posix
強制鎖程序read/write時由核心檢查 system v
5)多路轉接
posix未實現。
select:bsd和svr4都支援
select對任意的fd都支援。
select bsd不是中斷後自動再啟動的,而svr4是。
select的返回值:
-1:被訊號中斷
0:超時,無fd準備好
>0:返回準備好的fd個數,bsd和svr4不同
6)非同步i/o
svr4只支援流裝置;bsd支援終端裝置和網路
svr4中,與流相關,訊號sigpoll;bsd sigio|sigurg
乙個程序只能有乙個訊號
svr4:ioctl, bsd fcntl
7)儲存對映
mmap:兩個異常 sigsegv,sigbus
unmap或程序終止,對映區被去除,關閉檔案不會
只支援磁碟檔案,不支援網路、終端等。
8) 訊號
posix標準
sigaction不再啟動
可再入的函式需要先儲存error
訊號處理程式中呼叫不可再入函式會產生不可預知的錯誤
posix:sigchild和sigcld語義可能不同,svr4處理sigcld的方式與其他訊號不同
未決訊號:從訊號產生到傳遞的過程。將訊號設定為阻塞即使其未決
訊號不排隊:
棧間跳躍:使用sigsetjmp和siglongjmp,儲存訊號遮蔽字
使用訊號需要精細的考慮!!
volatile sig_atomic_t 保證變數不跨越頁邊界訪問,只一條指令足夠當兩個不同的函式需要訪問乙個變數的時候,最好將變數定義為volatile
幾個系統呼叫:
system:posix父程序阻塞sigint和sigquit
sigsuspend: (atomic begin;) sigpromask;pause (atomic end;)
abort:是否清理ansi c和posix不同,保證退出呼叫者程序
sleep:實現不同,可能與alarm干擾
常用訊號:sigchild/sigcld, sigterm, sigint, sigsegv,sigbus
9)程序間通訊
管道和fifo:posix
1.是否為阻塞模式
2.建立與開啟同步
3.讀/寫同步
4.讀寫/關閉同步
5.多程序同步,一般兩個程序
6.訊號sigpipe,error是epipe
7.pipe_buf是管道的寫快取,程序寫〉pipe_buf的資料會被其他程序中斷
系統v的 ipc
訊號量:功能強大,使用複雜 vs 記錄鎖
訊息佇列:deprecated
共享儲存:同步和互斥可用檔案鎖或訊號量來實現
如何使用ipc:
i 建立和引用ipc 關鍵字和標誌位決定
ii 需要顯示的刪除ipc,無程序訪問,管道即徹底刪除,fifo則只留名字在系統中
10) 精靈程序:無終端,sid = gid = pid ,修改umask = 0, close(fds)
unix環境高階程式設計
unix 日曆時間 自1970 年1 月1 日00 00 00 以來的國際標準時間 utc 程序時間 cpu 時間 時鐘時間 程序執行時間的總量。使用者cpu 時間 執行使用者指令時間量。系統cpu 時間 執行核心所經歷時間。命令 time 第三章至第七章 原子操作 任何乙個要求多於1 個函式呼叫的...
unix環境高階程式設計
檔案描述符file descriptor通常是乙個小的非負整數,核心用以標識乙個特定程序正在訪問的檔案。當核心開啟乙個現有檔案或建立乙個新檔案時,它都返回乙個檔案描述符。在讀寫檔案時,可以私用這個檔案描述符。按管理,每當執行乙個新程式時,所有的shell都為其開啟了3個標準檔案描述符 標準輸入,標準...
UNIX環境高階程式設計
本書是被譽為unix程式設計 聖經 的advanced programming in the unix environment一書的更新版。在本書第1版出版後的十幾年中,unix行業已經有了巨大的變化,特別是影響unix程式設計介面的有關標準變化很大。本書在保持了前一版風格的基礎上,根據最新的標準對...