Open System Services Programmer's Guide

#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
char *fifo[3] = { /* up to 3 named pipes */
"fifo-1",
"fifo-2",
"fifo-3"
};
char *ofile[3] = { /* up to 3 output files */
"ofile-1",
"ofile-2",
"ofile-3"
};
fd_set m_rfds; /* master set of fd_set values */
fd_set s_rfds; /* fd_set values used by select */
int maxfdp1; /* Max. file descriptor number plus 1 */
int rd[3]; /* read/write file descriptors */
int fd[3]; /* fifo file descriptors */
int nrd[3]; /* number of bytes read */
int nread; /* number of bytes read in one read */
int totread; /* running subtotal number of bytes read */
int sumread; /* total number of bytes read */
char buf[3][512]; /* data buffers */
main(int argc, char ** argv)
{
int i; /* counter */
int cnt; /* open fifo counter */
int nfifo; /* number of named pipes created */
int p; /* child process number */
nfifo = argc - 1;
if(nfifo < 1 || nfifo > 3) {
fprintf(stderr, "Specify the names of 1 to 3 files to read.\n");
exit(EXIT_FAILURE);
}
for(i = 0; i < nfifo; i++) { /* create named pipes */
unlink(fifo[i]);
if(mkfifo(fifo[i], 0644) < 0) { /* read/write permissions */
fprintf(stderr, "Can't create fifo %s\n", fifo[i]);
exit(EXIT_FAILURE);
}
}
/* Create child process to read files whose names are passed as arguments
to the program, and write the contents to the named pipes (fifos).*/
if((p = fork()) < 0) {
fprintf(stderr, "Can't create new child process.\n");
exit(EXIT_FAILURE);
} else if(p) { /* Execute code for child process */
printf("Parent process started.\n");
for(i = 0; i < nfifo; i++) /* open fifos for write */
if((fd[i] = open(fifo[i], O_WRONLY)) < 0) {
fprintf(stderr, "Can't open %s\n", fifo[i]);
exit(EXIT_FAILURE);
}
for(i = 0; i < nfifo; i++) /* open files for read */
if((rd[i] = open(argv[i+1], O_RDONLY)) < 0) {
fprintf(stderr, "Can't open %s\n", argv[i+1]);
exit(EXIT_FAILURE);
}
sumread = 0;
do {
totread = 0;
for(i = 0; i < nfifo; i++) {
if(nrd[i] < 0) /* don't read if end-of-file */
continue;
if((nrd[i] = read(rd[i], buf[i], 512)) > 0) {
write(fd[i], buf[i], nrd[i]);
totread += nrd[i];
} else
Common Completion 85