dup2: write () перенаправляется, но не fprintf () или put ()

Я пытаюсь прочитать STDOUT дочернего процесса.

Вот функция fork (да, c ++).

bool ForkAvecBus::start() {
child_pid = fork();

if(child_pid == -1)
return true;

if(child_pid == 0) {
/* Child process closes up input side of pipe */
close(child_stdin[WRITE]);
dup2 (child_stdin[READ], STDIN_FILENO);

close(child_stdout[READ]);
dup2 (child_stdout[WRITE], STDOUT_FILENO);
close(child_stdout[WRITE]);

execl("/bin/sh", "/bin/sh", "-c", ExecName.c_str(), NULL);
exit(0);

} else {
/* Parent process closes up output side of pipe */
close(child_stdin[READ]);
close(child_stdout[WRITE]);

signal(SIGTERM,exit_on_parent_quit);
}
}

Вот (простой) тест в дочернем процессе:

int main() {
fprintf(stdout, "fromFprintf\n", 12);
puts("auieauie");
write(STDOUT_FILENO, "fromWrite", 9);
}

И вот метод для чтения:

void ForkAvecBus::readFromChild() {
FILE* fp = fdopen(child_stdout[READ], "r");
// Tests
int bytes_read = -1;
char readbuffer[1000];
while (1) {
//char c=getc(fp);
//std::cout << "From child: <<" << c << ">>" << std::endl;

bytes_read = read(child_stdout[READ], readbuffer, 999);
if (bytes_read <= 0)
break;
readbuffer[bytes_read] = '\0';
std::cout << "From child: <<" << readbuffer << ">>" << std::endl;
}
}

Как видите, я тоже пробовал getc ().
И все, что я получаю, это:

From child: <<fromWrite>>

Почему fprintf (и printf) и put не перенаправлены?

3

Решение

Поведение, которое вы наблюдаете здесь, вероятно, связано с буфер. поскольку write(STDOUT_FILENO,...) обойти буфер времени выполнения, чтобы он напрямую достигал канала. Два других буферизируются во время выполнения.

Различия между puts, fprintf(stdout,...) а также write(STDOUT_FILENO,...) объясняется в этом посте: Разница между стандартным выводом и STDOUT_FILENO в LINUX C

Просто позвони fflush в конце вашей детской программы.

Чтобы проверить теорию:

#include<cstdio>
#include<unistd.h>
int main() {
fprintf(stdout, "fromFprintf\n", 12);
puts("auieauie");
write(STDOUT_FILENO, "fromWrite", 9);
return 0;
}

Программа печатает:

fromWritefromFprintf
auieauie

Смотреть порядок не то, что вы ожидаете. Мое предложение не пропустите STDOUT_FILENO а также stdout в вашей программе. Придерживайтесь одного из них и не забудьте позвонить fflush,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]