Linux pipe: захват в режиме реального времени вывода ping через popen - PullRequest
6 голосов
/ 30 июня 2011

Linux / C / pipe:

Как мне записать вывод команды ping с помощью popen (или аналогичных системных вызовов).В настоящее время popen будет ждать, пока ping не закончится.Тогда вывод будет сброшен вместе.

Псевдокод:

fp= popen("ping x.x.x.x", "r");
while(!feof(pFp))
{
   if(fgets(fp ...) // <==currently the code blocks here until ping finishes in popen
   { 
       printf(...real time ping output here);
   }
}

1 Ответ

7 голосов
/ 30 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...