Ваш нынешний подход, вероятно, не будет делать то, что вы хотите. Когда вы просто дублируете дескрипторы файлов, все они относятся к одному и тому же трубу - нет данные собираются получить дубликаты. Для каждого блока данных, отправленного исходной командой, ровно один процесс будет читать его.
Если вы хотите, чтобы дублировать данные (например, утилита 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. */
обработки ошибок остается в качестве упражнения для читателя;)
Действительно ли dup() возвращает -1? Вы пытались проверить errno? – Vereb
Что именно вы подразумеваете под 'больше не работает'? Я догадываюсь, что ваши чтения терпят неудачу, а не 'dup' failing – Hasturkun