Linux - Отключение буферизованного ввода-вывода в файл в дочерних процессах - PullRequest
1 голос
/ 18 октября 2011

В моем приложении я создаю группу дочерних процессов. После fork () я открываю файл для каждого процесса, устанавливаю stdout / stderr созданного процесса, чтобы он указывал на этот файл, а затем исполняю нужную программу.

Есть ли возможность для родительского процесса настроить все так, чтобы, когда дочерний процесс выполнял printf, он немедленно сбрасывался в выходной файл без необходимости вызова flush ()? Или есть API, который можно вызвать из самого дочернего процесса (до exec) для отключения буферизованного ввода-вывода?

1 Ответ

0 голосов
/ 18 октября 2011

Проблема здесь в том, что printf буферизуется. Базовые файловые дескрипторы не буферизуются таким образом (они буферизируются в ядре, но другой конец может читать из того же буфера ядра). Вы можете изменить буферизацию, используя setvbuf, как указано в комментарии, который должен был быть ответом.

setvbuf(stdout, NULL, _IONBF, 0);

Вам не нужно делать это для stdin или stderr.

Вы не можете сделать это из родительского процесса. Это потому, что буферы создаются дочерним процессом. Родительский процесс может манипулировать только основными файловыми дескрипторами (которые находятся в ядре), а не stdout (который является частью библиотеки C).

P.S. Вы имеете в виду fflush, а не flush.

...