在C/C++中我想多次写入同一个管道

问题描述:

我有一个在两个进程之间创建管道的程序。一个进程持续监视另一个进程的输出,当遇到特定输出时,它会通过其他管道输入write()函数。我遇到的问题是,虽然管道的内容没有通过其他进程的stdin流,直到我管道close()。我希望这个程序无限循环,并在每次遇到它正在寻找的输出时作出反应。有没有办法在不关闭管道的情况下将输入发送到其他进程?在C/C++中我想多次写入同一个管道

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

+0

第一个过程如何写入管道?如果它使用'fprintf()'等,那么其输出可能被缓冲。对'fflush()'的调用应该会通过数据。 – 2011-03-14 19:00:41

+0

它正在通过一条类似'write(pipe [1],string,strlen(string));'的线写入管道。 'fflush()'看起来很有希望,我会试试看。 – Alex 2011-03-14 19:17:22

你是如何看另一端的?你期待完整的字符串吗?您不会在发布的代码段中发送终止NUL。也许发送strlen(字符串)+1字节将修复它。没有看到代码,很难说。

+0

管道的另一端是进入程序的stdin流,我没有源代码因此,基本上我创建了管道,分叉了一个新进程,在子进程中,我使用'dup2'将管道连接到'stdin'和'stdout'。我会尝试你的建议并报告给我发现,感谢您的建议。 – Alex 2011-03-15 02:22:49

+0

非常感谢,您的建议让我获得了解决问题的大部分答案。输入是一种命令行,所以我的问题是我没有在最后使用换行符来模拟按下Enter键来提交命令。 – Alex 2011-03-15 02:40:36

+0

提到什么代码段? – 2015-03-05 08:22:49

看看使用fflush。    

+0

我读了一下,你确定你可以在管道上使用'fflush'吗?问题是输入被压入管道的缓冲区,然后坐在那里,而不是被发送到第二个进程的标准输入。如果我使用'write(pipe [1],str,strlen(str));关闭(pipe [1]);'输入将被发送,但我似乎无法找到任何其他方式来发送。 'pipe [1]'是一个'integer',fflush以'FILE *'作为参数,我不确定如何使用它。 – Alex 2011-03-14 19:28:07

+0

@Alex:如果我没有记错,整数是一个文件描述符,你可以用fdopen打开它。 http://*.com/questions/650468/how-can-i-use-fprintf-and-write-to-a-pipe这可以是相当方便的,如果你想用管道使用fprintf之类的东西。 – GWW 2011-03-14 19:43:47

+0

我试过了,它使用fdopen编译,但它仍然没有将输入推送到子进程。 – Alex 2011-03-14 20:07:10

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

http://www.delorie.com/gnu/docs/glibc/libc_239.html: 一旦写入返回,数据将被写入队列并立即读回,但不一定立即写入永久存储区。当您需要确保您的数据已被永久存储时,您可以使用fsync,然后再继续。 (对于系统而言,批处理连续写入操作更为高效,并且在方便时一次完成所有操作,通常它们将在一分钟或更短时间内写入磁盘。)现代系统提供另一个函数fdatasync,该函数仅保证文件的完整性数据,因此速度更快。您可以使用O_FSYNC打开模式在写入数据之前始终将数据存储到磁盘。

+0

Fsync似乎也没有做到这一点 – Alex 2011-03-14 19:57:44