2012-06-09 52 views
-1

我试图在两个进程(如聊天室)之间进行通信。每个进程都有自己的终端窗口。我正在使用命名管道进行通信。使用命名管道和信号量进行两个进程之间的通信

这里就是我所做的:

我有一个名为 “MYFILE” FIFO_FILE。过程A将新行写入MYFILE,过程B从MYFILE读取并将行输出到过程B的终端显示。然而,如果进程B想要写一个新行到MYFILE,(根据我对信号量的理解),进程A将被阻止读/写MYFILE,直到进程B完成写入。

我想实现的是:当两个进程想要写入时,当其他进程在写入文件之前,其他进程都不应该被阻塞。

我能想到的唯一方法是有两个FIFO_FILE。但是如何实现这个实现呢? 还是有其他方法可以实现吗?

我被告知使用Consumer-Producer模式,但我不明白这将如何解决我的问题。

任何帮助将是伟大的。谢谢!!

回答

0

假设某种* nix的环境,这一点将无法工作。只要管道长度在PIPE_BUF以下,管道读/写保证是原子的。让两个进程同时写入同一个fifo并没有什么意义。把它想像写入一个文件 - 为什么你想要两个独立写入的内容被穿插?你如何理解它?

你真的应该考虑使用多个fifos。即使那样你也可能需要使用多线程或非阻塞FIFO,并且可以使用selectpoll来实现我认为你真正想达到的目标。

+0

我在想双向聊天程序,因为没有人在输入消息的时候被阻塞,而不是像输出一些东西,并等待来自另一个进程的回复。但我一定会看到“多个FIFOs”---从未想过这个术语,但谢谢! – user1420474

+0

我想我们可能会说话过去。一个FIFO的问题是两个进程都必须以读/写方式打开它。我怀疑你认为读者一定会收到作者写的东西。 FIFOs的情况并非如此。根据时间的不同,完整的可能过程A可以写入FIFO,然后立即读取它刚刚写入的内容。进程B永远不会看到它。使用2个FIFO时,一个进程读取1个FIFO,另一个写入它。与第二个FIFO相反。或者简化你的生活,并使用更适合这个的unix域套接字。 – Duck

相关问题