Использовать вывод незавершенного процесса в программе на Си - PullRequest
3 голосов
/ 15 февраля 2011

Я использую tcpstat в среде Linux. Я хочу захватить ее вывод в программе на C, хотя она еще не закончена. Я попытался использовать функцию popen (), но она может обработать вывод только после , когда программа закончила. Я хочу обрабатывать вывод tcpstat на лету, как и когда он печатает его на стандартный вывод. Как мне это сделать?

Например,

$ tcpstat -i wlan0 1
Time:1297790227 n=2 avg=102.50  stddev=42.50    bps=1640.00
Time:1297790228 n=11    avg=86.36   stddev=19.05    bps=7600.00
Time:1297790229 n=32    avg=607.97  stddev=635.89   bps=155640.00
Time:1297790230 n=13    avg=582.92  stddev=585.55   bps=60624.00

Вышеуказанный вывод продолжается до бесконечности. Поэтому я хочу обработать вывод в программе на C, когда tcpstat выводит что-то на стандартный вывод.

Спасибо и всего наилучшего,

Хришикеш Мурали

Ответы [ 2 ]

6 голосов
/ 15 февраля 2011

Запустите tcpstat -i wlan0 -a 1 | your_program и прочитайте со стандартного ввода в вашей программе.Таким образом, оболочка позаботится о трубопроводе.

Библиотечная функция popen и системный вызов pipe могут использоваться для достижения того же результата на более низком уровне.Возможно, вы захотите взглянуть и на именованные каналы - они выглядят как файлы в пользовательском пространстве и могут управляться таким же образом.

5 голосов
/ 15 февраля 2011

Запустите tcpstat с опцией -F, это приведет к сбросу выходных данных на каждом интервале.(вместо использования буферизации блока по умолчанию для стандартного вывода)

Кроме того, вы можете явно отключить буферизацию для вашего popen FILE-дескриптора, используя setbuf, например.

setbuf(popen_fd, NULL);

В качестве альтернативы, вы можете установить его в строку буферизации, используя setlinebuf

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