![]() |
Linux
Application Development |
Michael K. Johnson Erik W. Troan |
/* mpx-select.c -- reads input from pipes p1, p2 using
select() for multiplexing */
#include <fcntl.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
int fds[2];
char buf[4096];
int i, rc, maxfd;
fd_set watchset; /* fds to read from */
fd_set inset; /* updated by select() */
/* open both pipes */
if ((fds[0] = open("p1", O_RDONLY | O_NONBLOCK)) < 0) {
perror("open p1");
return 1;
}
if ((fds[1] = open("p2", O_RDONLY | O_NONBLOCK)) < 0) {
perror("open p2");
return 1;
}
/* start off reading from both file descriptors */
FD_ZERO(&watchset);
FD_SET(fds[0], &watchset);
FD_SET(fds[1], &watchset);
/* find the maximum file descriptor */
maxfd = fds[0] > fds[1] ? fds[0] : fds[1];
/* while we're watching one of fds[0] or fds[1] */
while (FD_ISSET(fds[0], &watchset) ||
FD_ISSET(fds[1], &watchset)) {
/* we copy watchset here because select() updates it */
inset = watchset;
if (select(maxfd + 1, &inset, NULL, NULL, NULL) < 0) {
perror("select");
return 1;
}
/* check to see which file descriptors are ready to be
read from */
for (i = 0; i < 2; i++) {
if (FD_ISSET(fds[i], &inset)) {
/* fds[i] is ready for reading, go ahead... */
rc = read(fds[i], buf, sizeof(buf) - 1);
if (rc < 0) {
perror("read");
return 1;
} else if (!rc) {
/* this pipe has been closed, don't try
to read from it again */
close(fds[i]);
FD_CLR(fds[i], &watchset);
} else {
buf[rc] = '\0';
printf("read: %s", buf);
}
}
}
}
return 0;
}