Your current approach probably won't do what you want. When you just duplicate the file descriptors, they all refer to the same pipe - no data is going to get duplicated. For each block of data sent by the source command, exactly one process is going to read it.
If you want to duplicate the data (like the tee
utility does), then you will need to explicitly do so:
#define TOTAL 4
int dest_fd[TOTAL];
int dest_fd_wr[TOTAL];
int y;
/* Build pipes for reading the data from the child process */
for (y = 0; y < TOTAL; y++)
{
int p[2];
pipe(p);
dest_fd[y] = p[0];
dest_fd_wr[y] = p[1];
}
/* Create a child process to handle the "tee"-style duplication */
if (fork() == 0)
{
/* Child process */
FILE *file_source = popen(source_command, "r");
FILE *file_sink[TOTAL];
char buffer[2048];
size_t nbytes;
for (y = 0; y < TOTAL; y++)
{
close(dest_fd[y]);
file_sink[y] = fdopen(dest_fd_wr[y], "w");
}
while ((nbytes = fread(buffer, 1, sizeof buffer, file_source)) > 0)
{
for (y = 0; y < TOTAL; y++)
{
fwrite(buffer, 1, nbytes, file_sink[y]);
}
}
_exit(0);
}
for (y = 0; y < TOTAL; y++)
{
close(dest_fd_wr[y]);
}
/* Now have a set of file descriptors in dest_fd[0..TOTAL-1] that each have
* a copy of the data from the source_command process. */
Error-handling is left as an exercise for the reader ;)