Linux下的i o復用 select

2021-10-09 07:20:06 字數 2379 閱讀 1851

1、i/o復用

乙個程序或者乙個執行緒能夠同時對多個檔案描述符(socket)提供服務,伺服器上的程序或執行緒如何將多個檔案描述符統一監聽,當任意乙個檔案描述符上有事件發生,其都能及時處理。

2、select函式

啟動監聽:int select(int nfds,fd_set *readfds , fd_set *writefds ,fd_set *excefds ,struct timeval *timeout);

每次啟動select呼叫時都能夠重新設定值readfds,writefds。

其中fd_set的結構體為

typedef struct

fd_set;

nfds:最大檔案描述符的值+1,

readfds:使用者感興趣的可讀事件的檔案描述符的集合,

wretefds:使用者感興趣的可寫事件的檔案描述符的集合,

execfds:異常事件的檔案描述符集合,

timeout:設定超時時間。如果timeout為null,select一直阻塞。

當select()函式的返回值

大於0 :返回就緒檔案描述符的個數

等於0 : 超時

等於-1 :出錯

select() 返回後,如何知道那些檔案描述符就緒?

以下巨集就是用來識別的:

int fd_zero(int fd, fd_set *fdset);

int fd_clr(int fd, fd_set *fdset);

int fd_set(int fd, fd_set *fd_set);

int fd_isset(int fd, fd_set *fdset);

3、以下是select函式的乙個簡單應用**

服務端來連線接收資料的**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

void

init_fds

(int

*fds,

int len)

}void

insert_fd

(int

*fds,

int fd,

int len)}}

void

delete_fd

(int

*fds,

int fd,

int len)}}

intmain()

fd_set

(fds[i]

,&readfds);}

}int n =

select

(maxfd+1,

&readfds,

null

,null

,null);

if(n<=0)

for(i=

0;i<

100;i++

)insert_fd

(fds,c,

100);}

else

;int n=

recv

(fd,buff,

127,0)

;if(n<=0)

printf

("%d %s\n"

,fd,buff)

;send

(fd,

"ok",2

,0);

}}}}

}

客戶端來連線傳送資料的**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

intmain()

;printf

("input:\n");

fgets

(buff,

128,

stdin);

if(strncmp

(buff,

"end",3

)==0)

send

(sockfd,buff,

strlen

(buff),0

);memset

(buff,0,

128)

;recv

(sockfd,buff,

127,0)

;printf

("buff=%s\n"

,buff);}

close

(sockfd)

;}

Linux系統程式設計 IO多路復用之select

i o 多路復用技術是為了解決程序或執行緒阻塞到某個 i o 系統呼叫而出現的技術,使程序不阻塞於某個特定的 i o 系統呼叫。select poll epoll 都是i o多路復用的機制。i o多路復用通過一種機制,可以監視多個描述符,一旦某個描述符就緒 一般是讀就緒或者寫就緒,就是這個檔案描述符...

Linux下I O復用模型

以下內容引述至 linux unix系統程式設計手冊 常見的程式使用的i o模型都是單個程序每次只在乙個檔案描述符上執行i o操作,每次i o系統呼叫會阻塞直到完成資料傳輸。對於許多應用來說,傳統的阻塞式i o模型已經足夠了,但這不代表所有的應用都能得到滿足。非阻塞式i o可以讓我們周期性地檢查 輪...

linux下的I O復用函式

select系統呼叫 select系統呼叫的功能是 在一段時間裡監聽使用者感興趣的檔案描述符上的可讀,可寫 異常等事件。這是linux上的select系統呼叫的原型 各個引數說明 nfds指定被監聽的檔案描述符的總數,它通常被設定為最大的檔案描述符的值加一,因為檔案描述符是從 0開始的。readfd...