【问题标题】:In C/C++ I want to write to the same pipe multiple times在 C/C++ 中,我想多次写入同一个管道
【发布时间】:2011-07-15 06:06:49
【问题描述】:

我有一个在两个进程之间创建管道的程序。一个进程不断监视另一个进程的输出,当遇到特定输出时,它会通过另一个管道使用write() 函数提供输入。不过,我遇到的问题是管道的内容在我close() 管道之前不会进入另一个进程的标准输入流。我希望这个程序在每次遇到它正在寻找的输出时无限循环并做出反应。有什么方法可以在不关闭管道的情况下将输入发送到其他进程?

我搜索了一下,发现命名管道可以在关闭后重新打开,但是我想知道是否还有其他选择,因为我已经编写了使用未命名管道的代码并且我还没有学会使用命名管道。

【问题讨论】:

  • 第一个进程如何写入管道?如果它使用fprintf() 等,那么它的输出可能正在被缓冲。调用fflush() 应该会推送数据。
  • 它正在使用类似于write(pipe[1], string, strlen(string)); 的行写入管道。 fflush() 看起来很有希望,我会试试看。

标签: c++ c file-io pipe named-pipes


【解决方案1】:

看看使用fflush

【讨论】:

  • 我读了一点,你确定你可以在管道上使用fflush 吗?问题是输入被推入管道的缓冲区,然后就坐在那里而不是被发送到第二个进程的标准输入。如果我使用write(pipe[1],str,strlen(str)); close(pipe[1]);,输入将被发送,但我似乎找不到任何其他方式来发送它。 pipe[1]integer,而 fflush 将 FILE * 作为参数,我不知道如何使用它。
  • @Alex:如果我没记错的话,整数是一个文件描述符,你可以使用 fdopen 打开它。 stackoverflow.com/questions/650468/… 如果您想在管道中使用 fprintf 之类的东西,这会非常方便。
  • 我试过了,它使用 fdopen 编译,但它仍然没有将输入推送到子进程。
  • @Alex:我不确定你的代码中可能还有其他问题。
  • 你误会了。如果您通过write 写作,fflush() 无关紧要。只有fwrites 被fflush 刷新。
【解决方案2】:

你在阅读另一端的情况如何?你期待完整的字符串吗?您没有在发布的 sn-p 中发送终止 NUL。也许发送 strlen(string)+1 个字节可以解决它。不看代码很难分辨。

【讨论】:

  • 管道的另一端进入我没有源代码的程序的stdin 流。所以基本上我正在创建管道,分叉一个新进程,在我使用dup2 将管道连接到stdinstdout 的子进程中。我会尝试您的建议并报告我的发现,感谢您的建议。
  • 非常感谢,您的建议让我大部分时间都在解决我的问题。输入将进入某种命令行,所以我的问题是我没有在末尾使用换行符来模拟按下回车键来提交命令。
  • sn-p指的是什么?
【解决方案3】:

使用 fsync。 http://pubs.opengroup.org/onlinepubs/007908799/xsh/fsync.html

来自http://www.delorie.com/gnu/docs/glibc/libc_239.html: 一旦写入返回,数据就会被排队写入并且可以立即读回,但不一定会立即写入永久存储。当您需要在继续之前确保您的数据已永久存储时,您可以使用 fsync。 (系统批量连续写入并在方便时一次完成所有写入会更有效。通常它们总是会在一分钟或更短的时间内写入磁盘。)现代系统提供了另一个函数 fdatasync ,它只保证文件的完整性数据,因此速度更快。您可以使用 O_FSYNC 开放模式,使 write 始终在返回之前将数据存储到磁盘。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多