系統呼叫 非阻塞處理 select函式

2021-06-26 08:04:57 字數 1142 閱讀 3104

select函式

功能:針對於socket,pipe管道檔案等特殊檔案的非阻塞處理方式;

int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

nfds:開啟檔案描述符中最大的加1;

readfds:讀檔案描述符集合;

writefds:寫檔案描述符集合;

exceptfds:異常檔案描述符集合;

可以使用已下函式來建立檔案描述符和各個集合之間的關係

fd_clr(int fd,fd_set* set);解除該檔案描述符和集合之間的關係;

fd_set(int fd,fd_set*set); 新增檔案描述符到指定的集合中;

fd_isset(int fd,fd_set *set);判斷該檔案是否可操作;

fd_zero(fd_set *set);將該集合清空;

timeout:超時時間設定;

struct timeval;

sec:秒usec:毫秒

null:完全阻塞情況,相當於阻塞狀態;

固定的struct timeval tv;將會將超時時間設定為sec 秒 usec毫秒;

在時間超時之前,如果select函式中指定的檔案描述符集合中出現可以讀,寫的檔案時,將會自動執行下面的程式,並返回乙個大於0的值;

如果時間超過了設定的值,還是沒有檔案描述符的狀態進行改變,將會返回乙個0;並程式繼續執行;

如果程式出現的錯誤,將會自動返回乙個小於0的值;

例如:

int fd = open("pipe",o_rdonly|o_nonblock);//如果不設定無阻塞模式,select將阻塞;

fd_set  readfds ;

fd_set  writefds;

fd_set exceptfds;

struct timeval tv = ;//sec = 10 , usec = 0;

int ret = select(fd + 1, &readfds,&writefds,&execptfds,&tv);

if(ret > 0)

else if(ret == 0)

else

阻塞和非阻塞系統呼叫

阻塞 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。例如,我們在csocket中呼叫receive函式,如果緩衝區中沒有資料...

select 模式 非阻塞

在windows 下設定select 模式的非阻塞。具體實現如下 客戶端 window 建立乙個socket 非阻塞,呼叫connect connect 立即返回。然後用select 檢查,如果可寫,就認為該 connect 連線成功,在具體實現的時候發現如果不清空可寫集,發現select 一直返回...

select與阻塞和非阻塞

這2天一直和同事在討論socket的非阻塞用在什麼場合,並且認為在select時,使用的socket要設定成阻塞的,今天在網上搜了一下,才發現,原來,我們搞錯了,乙個套接字阻塞或者不阻塞,select就在那裡,它可以針對這2種套接字使用,對任何一種套接字的輪詢檢測,超時時間都是有效的,區別就在於 當...