У меня проблема с дочерними процессами и трубами в C.Отправить двоичные данные по трубам C
Моя программа создает два дочерних процесса (silblings), а также две трубы. Отец читает от stdin
и отправляет данные через первый канал. Первый ребенок перенаправляет stdin
на первый канал и stdout
на второй канал. После этого ребенок бежит gzip -cf
с execlp(3)
. Второй ребенок читает со второго канала и записывает данные в stdout
(или в файл).
Я пробовал, но он не работает с двоичными данными. Если первый ребенок отправляет только текстовые данные через второй канал (без использования gzip), а второй ребенок читает его, программа работает нормально. Но если я использую gzip с execlp()
, и процесс записывает двоичные данные, программа не работает, потому что я не получаю все данные.
Вот часть кода:
Первый ребенок:
/* Close the pipe-ends which are not needed [...] */
/* Redirect the stdin and stdout with dup2 [...] */
if(execlp(EXEC,EXEC_ARG0,EXEC_ARG1,(char*) 0) == -1) /* run execlp with 'gzip -cf' */
bail_out(EXIT_FAILURE,"Child_1: Cannot execute "EXEC_ARG0" "EXEC_ARG1"!");
Второй ребенок:
/* Close the pipe-ends which are not needed [...] */
FILE *fd = NULL;
char str[4096];
fd = fdopen(pipefd_com2[0],"rb");
(void) fread(str,sizeof(str),1,fd); /* read from pipe */
(void) fclose(fd);
FILE *fw = NULL;
if(file_arg == NULL) /* check if there was a file as argument */
fw = stdout;
else
fw = fopen(file_arg,"wb");
if(fw == NULL)
bail_out(EXIT_FAILURE,"Failed to write file!"); /* does not return */
(void) fwrite(str,strlen(str),1,fw); /* write to stdout or file */
(void) fclose(fw);
Преднамеренное отбрасывание в пустоту в этом коде для шумоподавления непроверенных предупреждений о возвращаемом значении, независимо от того, какой статический анализ тщательно изучает ваш код, особенно неудобен, поскольку по крайней мере в одном случае ** не ** проверка этих значений является частью вашей проблемы , – WhozCraig