تابع ()poll

این تابع مجموعه ای از file descriptor ها را بررسی میکند که آیا آماده نوشتن یا خواندن هستند یا نه

#include <poll.h>
 
int poll(struct pollfd *fds, nfds_t nfds, int timeout);

ابتدا باید file descriptor های مورد نظر مان را در استراکچر از نوع pollfd پر کنیم

struct pollfd {
    int   fd;         // the socket descriptor
    short events;     // bitmap of events we're interested in
    short revents;    // when poll() returns, bitmap of events that occurred
};

فیلدهای event و revent درواقع bitwise-OR از مقادیر زیر هستند

POLLIN  : data is ready to recv() on this socket
POLLOUT : send()ing data to this socket is possible without blocking

در تابع ()poll مقدار منفی برای timeout به معنی بینهایت است

مقدار بازگشتی تابع ()poll تعداد file descriptor هایی است که event مورد نظر در آنها اتفاق افتاده، یعنی آماده خواندن یا نوشتن هستند.

باید در آرایه fds برای file descriptor های جدید (که معمولا ضمن فراخوانی تابع ()accept ایجاد می شوند) جا باشد و گرنه باید با realloc به fds حافظه اضافه کنیم

برای پاک کردن file descriptor ها از آرایه fds می توان آخرین عضو آرایه را جای آن کپی کرد و یک عدد از طوا آرایه کم کرد. یا می توان به جای آن یک عدد منفی نوشت تا تابع ()poll آن را نادیده بگیرد.