Чтение выходных данных дочернего процесса, как только они станут доступны? - PullRequest
3 голосов
/ 01 августа 2010

Я пробовал различные методы (popen, pipe + fork / exec, ...), чтобы прочитать выходные данные дочернего процесса, все они работают, но демонстрируют одинаковое поведение: всякий раз, когда я пытаюсь прочитать выходные данные используя read / fread, он возвращается только тогда, когда буфер полностью заполнен или когда дочерний процесс завершается. Я ищу поведение, похожее на поведение сокетов: чтение любого количества данных, как только оно станет доступным.

Как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 01 августа 2010

Обычно нет. В частности, дочерний процесс будет буферизовать поток, потому что он не увидит поток, подключенный к каналу, как «интерактивный». Поскольку буферизация происходит внутри дочернего процесса, единственный способ предотвратить это - переписать код в дочернем процессе, чтобы предотвратить его буферизацию стандартного вывода (либо когда-либо, либо когда передается определенный переключатель, либо, возможно, вы можете добавить код определить, когда он подключен к каналу, и отключить буферизацию только в этом конкретном случае). Это, однако, может повлиять на производительность ребенка, если он много пишет в стандартный вывод (особенно если вы не избирательны в отношении отключения буферизации).

2 голосов
/ 01 августа 2010

Я не думаю, что это возможно. Буферизация обрабатывается на стороне ребенка, и если она не очищает свои буферы, вам нечего читать. Однако некоторые инструменты имеют параметры командной строки для управления буферизацией, например, grep --line-buffered.

...