多路復用I O select

2021-08-04 18:35:10 字數 2961 閱讀 1603

#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是非面向連線的,沒有乙個客戶端可以老是佔住服務端.只要處理過程不是死迴圈,伺服器對於...