Why use poll()?

  • Suppose you have to deal with multiple clients connected at the same time. A natural question, then, is: how can you read from multiple file descriptors (sockets) at once?
  • Do you need to make some really annoyingly multi-threaded code to handle each client that’s connected?
  • Do you have to go into some stupid loop constantly checking each socket to see if data’s available?
  • You can resolve this issue efficiently by polling file descriptor(Sockets here).

poll()system call

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <fcntl.h>
#include <stdio.h>
#include <sys/poll.h>
#include <sys/time.h>
#include <unistd.h>

int main( int argc, char *argv[])
{
        char buf[1024];
        struct pollfd pfds[1] = { STDIN, POLLIN};   // No of files discriptors to poll for
        int timeout = 5000;                     // Time Out

        int ret = poll(pfds, 1, timeout);       // Polling for file discriptors provided with timeout

        if ( ret && pfds[0].revents & POLLIN) {
                int i = read(0, buf, 1024);
                buf[i] = 0;
                printf("You Typed : %s\n", buf);
        }
        else if( ret == 0 ){
                printf("Time Out!\n");
        }

        return 0;
}

Points to catch

  • The idea behind multiplexing is that the operating system (kernel) knows when data is ready on a socket. You hand the operating system an array of file descriptors and say “tell me when something happens on one of these”.
  • Your code blocks (stops executing) until there is data ready for you. At that point, you iterate through your array of file descriptors to determine which one has data ready.