在C/C++中我想多次写入同一个管道
我有一个在两个进程之间创建管道的程序。一个进程持续监视另一个进程的输出,当遇到特定输出时,它会通过其他管道输入write()
函数。我遇到的问题是,虽然管道的内容没有通过其他进程的stdin流,直到我管道close()
。我希望这个程序无限循环,并在每次遇到它正在寻找的输出时作出反应。有没有办法在不关闭管道的情况下将输入发送到其他进程?在C/C++中我想多次写入同一个管道
我已经搜索了一下,发现命名管道可以在关闭它们后重新打开,但我想知道是否有另一个选项,因为我已经编写了使用未命名管道的代码,但我还没有学会使用命名管道。
你是如何看另一端的?你期待完整的字符串吗?您不会在发布的代码段中发送终止NUL。也许发送strlen(字符串)+1字节将修复它。没有看到代码,很难说。
看看使用fflush。
我读了一下,你确定你可以在管道上使用'fflush'吗?问题是输入被压入管道的缓冲区,然后坐在那里,而不是被发送到第二个进程的标准输入。如果我使用'write(pipe [1],str,strlen(str));关闭(pipe [1]);'输入将被发送,但我似乎无法找到任何其他方式来发送。 'pipe [1]'是一个'integer',fflush以'FILE *'作为参数,我不确定如何使用它。 – Alex 2011-03-14 19:28:07
@Alex:如果我没有记错,整数是一个文件描述符,你可以用fdopen打开它。 http://*.com/questions/650468/how-can-i-use-fprintf-and-write-to-a-pipe这可以是相当方便的,如果你想用管道使用fprintf之类的东西。 – GWW 2011-03-14 19:43:47
我试过了,它使用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打开模式在写入数据之前始终将数据存储到磁盘。
Fsync似乎也没有做到这一点 – Alex 2011-03-14 19:57:44
第一个过程如何写入管道?如果它使用'fprintf()'等,那么其输出可能被缓冲。对'fflush()'的调用应该会通过数据。 – 2011-03-14 19:00:41
它正在通过一条类似'write(pipe [1],string,strlen(string));'的线写入管道。 'fflush()'看起来很有希望,我会试试看。 – Alex 2011-03-14 19:17:22