Отправить EOF в трубу, не закрывая его - PullRequest
4 голосов
/ 09 марта 2012

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

Проблема в том, чтов двоичном формате GnuPlot ожидает, что EOF (Ctrl + D) завершит передачу и отобразит данные.Это легко в режиме консоли UNIX.Простое нажатие клавиш Ctrl + D завершит ввод данных, отобразит данные и откроет консоль в ожидании новых команд.

Но в моем приложении на C ++ единственный способ отправить EOF - закрыть канал.Это приводит к тому, что процесс gnuplot умирает и не отображает график на экране.

t Есть ли хитрость для отправки EOF в канал?¿Как терминалу UNIX удается отправить EOF без закрытия канала с запущенным процессом?

PD: я не могу закрыть и снова открыть GnuPlot с помощью «-persist», потому что это генерирует НОВЫЙ график вместоОбновление старого графика (это система реального времени, поэтому она генерирует окна около ~ inf).

1 Ответ

1 голос
/ 09 марта 2012

Я не думаю, что то, что вы хотите сделать, сработает.См. Например:

http://www.velocityreviews.com/forums/t365339-write-eof-without-closing.html

Можем ли мы сами написать символ EOF?

По сути EOF не является символом как таковым.Это конец файла.

Так что, как я отметил в комментарии выше, я предлагаю вам попробовать использовать библиотеку, которая соединяет вас напрямую с gnuplot.Тогда вы сможете контролировать его таким образом, чтобы достичь желаемого поведения (скорее всего, используя что-то вроде replot).

...