1 低速系統呼叫
可能使程序永遠阻塞的一類系統呼叫,包括:
1)讀某些檔案型別(管道、終端、網路裝置)的資料
2)寫某些檔案型別(管道、終端、網路裝置),但資料不能被立即接受(管道中無空間、流量控制等因素)
3)開啟某些檔案型別
4)對已經加上強制性記錄鎖的檔案進行讀、寫
5)某些ioctl函式
6)某些程序間通訊函式
2 記錄鎖
當乙個程序正在讀或修改檔案的某一部分時,可以阻止其他程序修改同一檔案區
#include int fcntl(int filedes,int cmd,.../*struct flock *flockptr
*/
structflock
f_getlk:判斷flockptr是否會被其他記錄鎖排斥,會則將排斥該鎖的鎖資訊填充到flockptr,不排斥則將l_type設定為f_unlck
f_getfl函式並不是查詢乙個檔案的記錄鎖,而是查詢乙個記錄鎖是否與其他記錄鎖衝突
f_setlk:嘗試建立flockptr描述的檔案鎖,非阻塞
f_setlkw:建立檔案鎖的阻塞版本
檔案的記錄鎖資訊在檔案v節點表中,通過struct flock型別鍊錶儲存
3 i/o多路轉接 select
當需要從多個檔案中進行讀寫操作時,阻塞式i/o和非阻塞式i/o各有問題
select函式在目標檔案描述符集中查詢是否有可讀、可寫的檔案描述符,有則返回,無則等待(或返回,與tvptr有關)
#include select.h>intselect(int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *tvptr)
readfds、writefds、exceptfds分別表示關心的可讀、可寫、異常檔案描述
maxfdp1表示三個檔案描述符集中最大檔案描述符加1
返回值:
-1:出錯
0:沒有檔案描述符準備好
正值:已經準備好的描述符數
tvptr:
structtimeval
;
tvptr=null:無限等待
tvptr->tv_sec==0 && tvptr->tv_usec==0:查詢並立即返回
tvptr->tv_sec!=0 || tvptr->tv_usec!=0 :最多等待時間
fd_set的操作:
#include select.h>int fd_isset(int fd,fd_set *fdset)
void fd_clr(int fd,fd_set *fdset)
void fd_add(int fd,fd_set *fdset)
void fd_zero(fd_set *fdset)
select函式變體pselect函式:
int pselect(int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *excepfds,conststruct timespec tsptr,const sigset_t *sigmaske)
pselect函式支援函式執行時訊號遮蔽字設定,同時時間採用timespec結構(秒和納秒,比timeval更精確)
4 i/o多路轉接 poll
poll函式類似於select函式但提供不同的函式介面:
int poll(struct pollfd fdarrat,nfds_t nfds,int timeout)
structpollfd
;
events表示在fd上關心的狀態,revents返回時被填寫
events和revents可取值:
pollin:不阻塞的可讀除高優先順序之外的資料
pollrdnorm:不阻塞的可讀普通資料
pollrdband:不阻塞的可讀非
0優先順序波段資料
pollpri:不阻塞的可讀高優先順序資料
pollout:不阻塞的可寫普通資料
pollwrnorm:與
pollout
相同pollwrband:不阻塞的可寫非
0優先順序波段資料
僅revents可取值:
pollerr:已出錯
pollhup:已結束通話
pollnval:描述符不引用一開啟檔案
5 儲存對映i/o
#include void *mmap(void *addr,size_t len,int prot,int flag,int filedes,off_t off)
prot:對映區許可權
prot_read:對映區可讀
prot_write:對映區可寫
prot_exec:對映區可執行
prot_none:對映區不可訪問
flag:
map_fixed:返回值必須等於addr
map_shared:緩衝區操作修改對映檔案
map_private:緩衝區操作對應對映檔案的副本
修改對映緩衝區許可權:
#include int mprotect(void *addr,size_t len,int prot)
解除對映:
int munmap(addr_t *addr,size_t len)
APUE讀書筆記 第14章 高階I O
14.1 引言 高階i o包括非阻塞i o 記錄鎖 系統v流機制 i o多路轉換 select和poll函式 readv和writev函式以及儲存對映i o mmap 14.2 非阻塞i o 非阻塞i o使我們可以呼叫open read和write這樣的i o操作,並使這些操作不會永遠阻塞 14.3...
UNIX程式設計 14 高階IO
1.非阻塞io 對於乙個給定的描述符有兩種方法對其指定非阻塞io 1 如果呼叫open獲得描述符,則可指定o nonblock標誌 2 對於乙個已經開啟的描述符,則可呼叫fcntl由該函式開啟o nonblock檔案狀態標誌 include apue.h include include char b...
第5章標準I O庫總結
1 fwide函式試圖設定流的定向 流的定向決定了讀寫單位元組還是多位元組字元 int fwide file fp,int mode 寬定向返回正值,位元組定向返回負值,為定向返回0已定向流不會改變流的定向 2 setbuf函式中指定的緩衝區的長度為bufsiz,這個常量在stdio.h中定義 3 ...