Файловые потоки и данные трубопроводов - PullRequest
0 голосов
/ 22 августа 2011

Я могу написать приложение, которое будет копировать все входные данные из cin в контейнер (скажем, набор), а затем распечатывать содержимое контейнера обратно в стандартный вывод. В случае набора они будут отсортированы.

Если бы я сделал это и скомпилировал, как, скажем, mysort, я мог бы зайти в Unix и использовать программу как часть конвейера.

cat myfile.txt | mysort

и выводом будут слова из отсортированного myfile.

В этом случае mysort не мог ничего сделать до тех пор, пока весь вывод файла catfing myfile.txt не был передан в него. Как я могу сделать что-то похожее на данные процесса, генерируемые на лету? (Не обращайте внимания на сортировку; я знаю, что для сортировки мне понадобятся все данные сразу, чтобы отсортировать их).

Например, если я запустил огромную программу (назовем ее огромныйprog) и хотел бы проанализировать stdout и stderr этой огромной программы во время ее работы, как бы я обработал ввод в мою программу-анализатор (myanalyzer)?

Я бы хотел выполнить этот анализ вместе с запуском программы следующим образом:

hugeprog 2>&1 | myanalyzer

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Я думаю, вы все еще можете столкнуться с проблемами буферизации. Если вы действительно хотите быть отзывчивым, попробуйте использовать fcntl, чтобы установить O_NONBLOCK для вашего дескриптора файла stdin.

fcntl (file_desc, F_SETFL, O_NONBLOCK); //

Это изменит часть поведения. Например, чтение из этого файла всегда сразу вернется, но оно может не содержать ничего или содержать только часть того, что ожидает чтения, поэтому вы должны настроить свой код так, чтобы он подходил.

1 голос
/ 23 августа 2011

как бы я обработал ввод в мою программу-анализатор (Myanalyzer)

Просто читая из stdin и записывая в stdout, вы заставите свою программу работать со всем, что передает данные в нее / из нее.

Вы просто должны следить за буферизацией при записи.

EDIT

Учитывая, что огромный пакет работает и постоянно генерирует данные, как мне это сделать? постоянно читать это в моем приложении?

Так же, как вы читаете ввод от пользователя. Мой C ++ не очень хорош, но cin.getline должен подойти. В C я бы использовал getline / `fgets.

Как я узнаю, когда огромная программа создаст конец потока символ

Это не его работа - создавать этого персонажа. Это просто искусственный способ, которым ОС говорит вам, что больше нет ввода.

Кроме того, что делать, если есть период времени, когда нет выхода производства

Вы ждете / устанавливаете таймер, а когда он заканчивается, вы выходите с ошибкой.

Будут ли мои вызовы cin просто блокироваться, пока не появятся данные, или это вызовет проблема

Он заблокирует (возможно, навсегда).

...