【问题标题】:Send a EOF in a pipe without closing it在管道中发送 EOF 而不关闭它
【发布时间】:2012-03-09 11:49:30
【问题描述】:

我正在编写一个使用 GnuPlot 绘制数据的应用程序。 我决定使用“二进制”格式,而不是使用文本格式通过管道通信两个程序(由于 vprintf() 和传递的大量数据,速度很慢)。

问题在于二进制格式的 GnuPlot 需要 EOF (Ctrl+D) 来结束传输并绘制数据。这在 UNIX 控制台模式下很容易。只需按 Ctrl+D 即可结束数据输入,绘制数据并保持控制台打开等待更多命令。

但在我的 C++ 应用程序中,发送 EOF 的唯一方法是关闭管道。这会导致 gnuplot 进程终止,并且不会在屏幕上显示绘图。

¿有什么技巧可以将 EOF 发送到管道吗? ¿ UNIX 终端如何在不关闭正在运行的进程的管道的情况下发送 EOF?

PD:我无法使用“-persist”关闭并重新打开 GnuPlot,因为这会生成一个新图而不是更新旧图(它是一个实时系统,因此它会在 ~inf 绘图窗口附近生成)。

【问题讨论】:

  • 您是否尝试过使用直接提供管道的库 go gnuplot?更多信息:ndevilla.free.fr/gnuplot
  • 那个界面看起来很酷。但是我自己已经写了一个草稿。无论如何,我认为它不处理“二进制”格式......或者至少我没有找到它。顺便说一句,我已经使用 gnuplot 的直接管道。
  • 这对你来说也可能很有趣:users.softlab.ntua.gr/~ttsiod/gnuplotStreaming.html 它使用 bash 来做管道。但是您可以使用程序的标准输出来进行绘图。

标签: pipe gnuplot eof


【解决方案1】:

我认为你想做的事情不会奏效。例如:

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

Can we write an EOF character ourselves?

基本上 EOF 本身不是字符。这是文件的结尾。

因此,正如我在上面的评论中所指出的,我建议您尝试使用将您直接连接到 gnuplot 的库。然后你应该能够控制它以实现你想要的行为(很可能使用类似replot 的东西)。

【讨论】:

  • EOF 无法做到这一点。但我想出了一个技巧来修复它,只需将大小发送到 gnuplot(二进制数组 = xxx)。这样它就可以在不关闭管道的情况下停止接受数据。还是谢谢!!!
  • 啊,第一次想到这个问题的时候,我也是这么想的。虽然不知道这是可能的。但这并不奇怪,因为在二进制文件的开头有一个大小是一种常见的做法。出于兴趣,您要发布您的库吗?
  • 对不起,图书馆是另一个项目的一部分,女巫是私人的。但这只是一个 popen() 命令,然后是一个 fprintf() 发送 gnuplot 命令 fprintf(pipe,"plot '-' binary format="%float64%float64" record=%d using lines",data) 和之后包含所有 RAW 数据的 fwrite。最难的部分就是找出“record=X”或“array=X”的技巧来避免管道中的 EOF。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2016-08-14
  • 2014-01-20
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多