#include
int select(int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict tvptr);
返回值:準備就緒的描述符數目:若超時,返回0;若出錯,返回-1
引數說明
(1)先來說明最後乙個引數,它指定願意等待的時間長度,單位為秒和微秒。有以下3種情況。
(2)中間3個引數readfds、writefds和exceptfds是指向描述符集的指標。這3個描述符集說明了我們關心的可讀、可寫或處於異常條件的描述符集合。每個描述符集儲存在乙個fd_set資料型別中。
對於fd_set資料型別,唯一可以進行的處理是:分配乙個這種型別的變數,將這種型別的乙個變數值賦給同型別的另乙個變數,或對這種型別的變數使用下列4個函式中的乙個。
#include
int fd_isset(int fd, fd_set *fdset);
返回值:若fd在描述符集中,返回非0值;否則,返回0
void fd_clr(int fd, fd_set *fdset);
void fd_set(int fd, fd_set *fdset);
void fd_zero(fd_set *fdset);
從select返回時,可以用fd_isset測試該集中的乙個給定位是否仍處於開啟狀態,如下:
if (fd_isset(fd, &fdset))
select的中間3個引數中的任意乙個(或全部)可以是空指標,此時select提供了比sleep更精確的定時器。
(3)select的第乙個引數maxfdp1的意思是」最大的檔案描述符編號值加1「。考慮所有3個描述符集,在3個描述符集中找出最大描述符編號值,然後加1,這就是第乙個引數值。也可將maxfdp1設定為fd_setsize,即系統中定義的最大描述符數(經常是1024)。
返回值
select有3個可能的返回值:
下面已乙個例子來演示select的用法。
我們有兩個程式,select.c和write_fifo.c。
select.c中,我們迴圈監聽了兩個描述符,stdin_fileno標準輸入描述符和命名管道fd。不同的fd上有資料反饋,在顯示器上會列印不同的輸出。
write_fifo.c中,每隔5秒向命名管道fd寫入」this is for test」。
/**
* select.c
* 多路復用select的用法
*/#include
#include
#include
#include
#define fifo_filename "test_fifo"
int main(int argc, char *argv)
ret = 0;
while (1) else
if (ret > 0) ;
if (fd_isset(0, &rfds)) else
if (fd_isset(fd, &rfds))
} else
if (ret == 0)
}exit(0);
}
/**
* write_fifo.c
* 給命名管道傳送資訊
*/#include
#include
#include
#include
#include
#define fifo_filename "test_fifo"
int main(int argc, char *argv)
fd = open(fifo_filename, o_rdwr);
if (fd < 0)
while (1)
exit(0);
}
編譯兩個程式
/myblog/myblog/source/select# gcc select.c -o select
/myblog/source/select# gcc write_fifo.c -o write_fifo
啟動select程式,如下:
/myblog/source/select
# ./select
fifo buf = this
isfor test
fifo buf = this
isfor test
fifo buf = this
isfor test
hello
stdin buf = hello
fifo buf = this
isfor test
fifo buf = this
isfor test
^c
啟動write_fifo程式,如下:
/myblog/source/select# ./write_fifo
mkfifo error: file exists
after write to fifo
after write to fifo
after write to fifo
after write to fifo
after write to fifo
^c
從程式執行結果可以看出,當write_fifo不斷往命名管道寫入」this is for test」時,select監聽到命名管道fd已準備好,從fd上讀出資料並列印到顯示器上;當我們從標準輸入中打出hello時,select監聽到stdin_fileno(描述符為0)已準備好,從描述符0中讀出資料並列印到顯示器上。 Linux IO多路復用
一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...
I O多路復用
一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...
Linux C Socket多路復用
1.迴圈伺服器 udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現.socket bind while 1 因為udp是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...