I O多路復用 select poll epoll

2021-09-27 08:28:46 字數 1634 閱讀 1250

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
typedef structfd_set;
可以理解為乙個long int型別的陣列,每一位代表乙個檔案描述符,fd_set最多可以表示1024個檔案描述符。當呼叫select時會將fd_set拷貝到核心,核心會判斷哪個fd有資料到來,如果沒有資料將會阻塞在這裡;當乙個或多個fd有資料到來,會將對應的fd_set置位並返回。fd_set不可重用。

sockfd = socket(af_inet, sock_stream, 0);

memset(&addr, 0, sizeof(addr));

addr.sin_family = af_inet;

addr.sin_port = htons(8000);

addr.sin_addr.s_addr = inaddr_any; //泛指本機ip

bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));

listen(sockfd, 5);

for(i=0; i<5; i++)

}while(1)

select(max+1, &rset, null, null, null);

for(i=0; i<5, i++)

}}

int poll(struct pollfd *fds, nfds_t nfds, int timeout);
struct pollfd
for(i=0; i<5; i++)

sleep(1);

while(1)

}}

int epoll_create(int size);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

int epoll_wait(int epfd, struct epoll_event events, int maxevents, int timeout);

typedef union epoll_data

epoll_data_t;

struct epoll_event

;

struct epoll_event events[5];

int epfd = epoll_create(10);

for(i=0; i<5; i++)

while(1)

{ nfds = epoll_wait(epfd, events, 5, 5000); //無資料阻塞 有資料返回

for(i=0; iepoll_wait返回有資料的fd個數,只需要對資料的前nfds的元素進行處理就行了。

I O多路復用

一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...

i o多路復用

最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...

I O多路復用

我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...