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);
}