Это не ждет, пока пинг не закончится. Скорее, ping ждет, пока буфер stdout
не заполнится, прежде чем что-либо записывать. Единственные способы избежать этого - использовать псевдо-тты. Либо вы должны отказаться от popen
и написать код для запуска дочернего процесса ping самостоятельно и использовать псевдо-tty для связи (это легко с нестандартной, но широко доступной функцией forkpty
), либо вы можете написать программу-оболочку, которая запускает ping через псевдо-pty, захватывает вывод и записывает его без буферизации от до stdout
.