【问题标题】:How can independent processes running on the same Ubuntu Machine communicate with each other?在同一台 Ubuntu 机器上运行的独立进程如何相互通信?
【发布时间】:2012-05-16 08:23:32
【问题描述】:

这个问题是独立于语言和连接方法的。实际上寻找方法是个问题。 我知道我可以通过 shell 中的 prog1 | prog2 之类的调用直接对两个进程进行管道传输,并且我已经阅读了有关 RPC 和套接字的一些内容。但是一切都太抽象了,无法真正掌握它。例如,我不清楚套接字是如何创建的,是否每个进程都需要创建一个套接字,或者多个进程是否可以使用同一个套接字相互传输消息,或者我是否可以完全摆脱套接字。

有人能解释一下 Linux 中的进程间通信是如何工作的以及我有哪些选择吗?

【问题讨论】:

    标签: linux ipc inter-process-communicat


    【解决方案1】:

    管道

    在生产者-消费者场景中,您可以使用管道,它是一种 IPC。管道就是顾名思义,它将接收器和源连接在一起。在他的 shell 中,源是标准输出,而接收器是标准输入,所以 cmd1 | cmd2 只是将 cmd1 的输出连接到 cmd2 的输入。

    使用管道,它会为您创建两个文件描述符。您可以将一个用于接收器,另一个用于源。创建管道后,您将分叉,一个进程使用文件描述符中的一个,而另一个进程使用另一个。

    其他 IPC

    IPC 是多种多样的:管道(在内存中)、命名管道(通过文件)、套接字、共享内存、信号量、消息队列、信号等。它们都有优缺点。网上和书籍中有很多关于它们的文献。在这里描述它们会很困难。

    基本上,您必须了解每个进程都有自己的内存,与其他进程分开。因此,您需要找到用于交换数据的共享资源。资源可以是“物理的”,例如网络(用于套接字)或大容量存储(用于文件),也可以是“抽象的”,例如管道或信号。

    【讨论】:

    • 我做了一个社区维基,所以如果有人有时间/知识,他们可以让它更详细:)
    • +1 很棒的总结。使用这样的关键字,我可以搜索更多内容。如果您对该主题有更多了解,也许您对我的后续问题也有答案:stackoverflow.com/questions/10736396/…
    • 我刚才确实提出了一个答案。 :)
    【解决方案2】:

    如果一个进程是生产者而另一个是消费者,那么您可以进行共享内存通信。为此,您需要一个信号量。一个进程将锁定信号量然后写入共享内存,另一个进程将锁定信号量并读取值。由于您使用信号量,因此会注意脏读/写。

    【讨论】:

    • 进程不共享内存。所以“共享内存通信”是不可能的。
    • 另外,“共享内存通信”(同一进程的线程之间)不仅仅用于“生产者-消费者”问题。
    • 共享内存可用于跨进程通信。请参考此链接ibm.com/developerworks/aix/library/au-spunix_sharedmemory/…
    • 所以您指的是linux.die.net/man/3/shm_open - 即“POSIX 共享内存”。我建议你改写你的答案并把它写进去。现在的措辞方式令人困惑(至少对我来说)。
    • @ArjunShankar 共享内存是 SUN Microsystem 在 SunOS(现为 Solaris,Oracle 的财产)上引入的概念。这个概念被大多数(如果不是全部)Unix和类Unix(包括Linux)采用。所以在Linux上确实有共享内存这样的概念,甚至还有两个API:IPC(SUN遗产)和POSIX。所以没有必要改写答案,因为这不会让 Unix 和 Linux 开发人员感到困惑。
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2018-02-18
    • 2019-08-27
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多