2012-03-09 6 views
4

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

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

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

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

PD: Я не могу закрыть и снова открыть GnuPlot с помощью «-perist», потому что он генерирует новый график вместо обновления старого сюжета (это система реального времени, так что она генерирует окна около окна inf inf).

+0

Пробовал ли вы использовать библиотеку, которая обеспечивает прямой канал gnuplot? Подробнее здесь: http://ndevilla.free.fr/gnuplot/ – Azrael3000

+0

Этот интерфейс кажется классным. Но я уже написал проект сам. В любом случае, я думаю, что он не обрабатывает «двоичный» формат ..... или, по крайней мере, я его не нашел. BTW Я уже использую прямой канал для gnuplot. – DarkZeros

+0

Это может быть интересно и вам: http://users.softlab.ntua.gr/~ttsiod/gnuplotStreaming.html Он использует bash для выполнения трубопроводов. Но вы можете использовать stdout вашей программы для создания графика. – Azrael3000

ответ

1

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

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

Can we write an EOF character ourselves?

В основном EOF не характер сам по себе. Это конец файла.

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

+0

Это не может быть сделано с EOF. Но я понял, как это исправить, просто отправив размер в gnuplot (двоичный массив = xxx). Таким образом, он перестает захватывать данные, не закрывая трубу. В любом случае, спасибо !!! – DarkZeros

+0

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

+1

Sry, библиотека является частью другой персонажей, которая является частной. Но это просто команда popen(), за которой следует fprintf(), отправляющая команды gnuplot fprintf (pipe, «plot» - «binary format =»% float64% float64 «record =% d using lines», data), и после этого fwrite со всеми данными RAW. Самая сложная задача заключалась лишь в том, чтобы выяснить «запись = X» или «массив = X», чтобы избежать EOF в трубе. – DarkZeros