Az előző program kiegészítése a select() és a poll() hívásokkal.

Csak a read_byte() bővítése, a teljes program ismétlése nélkül.
A poll() használata esetében a header include a program elejére menjen ahol a többi ilyen van.

Vissza


#include <sys/poll.h>

/*
 * A read_byte() függvény testében a comment jeleket
 * távolítsuk el a hívni kivánt függvény elől
 * vagyaz adott függvényt átnevezve read_byte()-ra
 * másuljuk át a megadott programba az eredeti helyére.
 *
 * Ne feledkezzünk el a poll() használata esetén a
 * #include <sys/poll.h> beillesztéséről!
 */


int
read_byte_direct (int fd, unsigned char *in_byte)
{
  int ret_val;
  int bytes_in;

  bytes_in = EINTR_RETRY (read (fd, in_byte, 1));

  ret_val = 0;
  if (bytes_in != 1)
    ret_val = -1;

  return (ret_val);
}

int
read_byte_select (int fd, unsigned char *in_byte)
{
#define TIMEOUT_VAL 1

  int ret_val;
  int bytes_in;
  fd_set read_fds;
  struct timeval timeout;

  FD_ZERO (&read_fds);
  FD_SET (fd, &read_fds);

  timeout.tv_sec = TIMEOUT_VAL;
  timeout.tv_usec = 0;

  ret_val = select (fd+1, &read_fds, NULL, NULL, &timeout);
  if (ret_val < 0)
    {
      perror ("Select error");
      ret_val = -1;
    }
  else if (ret_val == 0)
    {
      perror ("Timeout");
      ret_val = -1;
    }
  else
    {
      ret_val = -1;
      if (FD_ISSET (fd, &read_fds))
        {
          bytes_in = EINTR_RETRY (read (fd, in_byte, 1));

          ret_val = 0;
          if (bytes_in != 1)
            ret_val = -1;
        }
      else
        perror ("FD_ISSET");
    }

  return (ret_val);
}

int
read_byte_poll (int fd, unsigned char *in_byte)
{
#define TIMEOUT_VAL_MSEC 100

  int ret_val;
  int bytes_in;
  struct pollfd pfd;

  pfd.fd = fd;
  pfd.events = POLLIN;
  ret_val = EINTR_RETRY (poll (&pfd, 1, TIMEOUT_VAL_MSEC));

  if (ret_val < 0)
    {
      perror ("Poll error");
      ret_val = -1;
    }
  else if (ret_val == 0)
    {
      perror ("Timeout");
      ret_val = -1;
    }
  else
    {
      bytes_in = EINTR_RETRY (read (fd, in_byte, 1));

      ret_val = 0;
      if (bytes_in != 1)
        ret_val = -1;
    }

  return (ret_val);
}

int
read_byte (int fd, unsigned char *in_byte)
{
  int ret_val;

  //ret_val = read_byte_direct (fd, in_byte);
  ret_val = read_byte_select (fd, in_byte);
  //ret_val = read_byte_poll (fd, in_byte);

  return (ret_val);
}