走馬觀書《unix環境高階程式設計》

2021-04-01 16:29:52 字數 2482 閱讀 1455

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程式設計介面的有關標準變化很大。本書在保持了前一版風格的基礎上,根據最新的標準對...