Ваш текущий подход, вероятно, не будет делать то, что вы хотите. Когда вы просто дублируете файловые дескрипторы, они все ссылаются на один и тот же канал - никакие данные не будут дублироваться Для каждого блока данных, отправляемых исходной командой, его будет читать только один процесс.
Если вы хотите дублировать данные (как это делает утилита tee
), вам необходимо явно сделать это:
#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. */
Обработка ошибок оставлена в качестве упражнения для читателя;)