【问题标题】:Communication between Two Processes using Named Pipes and Semaphores使用命名管道和信号量的两个进程之间的通信
【发布时间】:2012-06-09 04:47:17
【问题描述】:

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

这就是我所做的:

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

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

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

有人告诉我使用消费者-生产者模式,但我不明白这将如何解决我的问题。

任何帮助都会很棒。谢谢!!

【问题讨论】:

    标签: c mutex pipe semaphore


    【解决方案1】:

    建议 - 您真的不需要带有命名管道的信号量,对吗?

    只要你想写就写,在大多数情况下,你会阻塞直到有东西要读。

    这里有一些关于在 Linux 上使用带有 shell 脚本的命名管道的简短教程:

    【讨论】:

    • 并非如此。但我认为使用信号量来防止另一个进程写入/读取。
    【解决方案2】:

    假设某种 *nix 环境这将不起作用。只要管道读/写低于 PIPE_BUF 长度,就保证它们是原子的。让两个进程同时写入同一个 fifo 并没有什么意义。把它想象成写一个文件——为什么要穿插两个独立写入的内容?你怎么理解它?

    您确实应该考虑使用多个 fifo。即使这样,您也需要使用多线程或非阻塞 FIFO 和 selectpoll 来实现我认为您真正想要实现的目标。

    【讨论】:

    • 我认为是双向聊天程序,因为没有人在输入消息时被阻止,而不是像一个输出一些东西并等待另一个进程的回复。但我肯定会研究“多个 FIFO”——从没想过这个词,但谢谢!
    • 我想我们可能正在互相交谈。一个 FIFO 的问题是两个进程都必须以读/写方式打开它。我怀疑你在想读者一定会收到作者写的东西。 FIFO 并非如此。根据时序,整个可能的过程 A 可以写入 FIFO,然后立即读取它刚刚写入的内容。进程 B 永远不会看到它。对于 2 个 FIFO,一个进程读取 1 个 FIFO,另一个进程写入。与第二个FIFO相反。或者简化您的生活并使用更适合此的 unix 域套接字。
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 2011-10-16
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多