第14章高階IO總結

2022-09-17 06:27:13 字數 2907 閱讀 2562

1 低速系統呼叫

可能使程序永遠阻塞的一類系統呼叫,包括:

1)讀某些檔案型別(管道、終端、網路裝置)的資料

2)寫某些檔案型別(管道、終端、網路裝置),但資料不能被立即接受(管道中無空間、流量控制等因素)

3)開啟某些檔案型別

4)對已經加上強制性記錄鎖的檔案進行讀、寫

5)某些ioctl函式

6)某些程序間通訊函式

2 記錄鎖

當乙個程序正在讀或修改檔案的某一部分時,可以阻止其他程序修改同一檔案區

#include int fcntl(int filedes,int cmd,.../*

struct flock *flockptr

*/

struct

flock

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:

struct

timeval

;

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,const

struct 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)

struct

pollfd

;

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 ...