在进程之间传递消息

Posted

技术标签:

【中文标题】在进程之间传递消息【英文标题】:Passing messages between processes 【发布时间】:2013-05-22 10:42:05 【问题描述】:

我需要编写一个简单的函数,在 linux 中执行以下操作:

创建两个进程。 让Process1 中的thread1 做一些小操作,操作完成后通过thread2 向Process2 发送消息。 *Process2 应确认收到的消息。

我不知道从哪里开始

    我编写了两个简单的函数,它们只是在一个循环中从 0 计数到 1000(循环在一个线程调用的函数中运行),我已经编译了它们以获取二进制文件。 我正在从一个 shell 脚本一个接一个地执行这些(都在后台运行) 一旦 process1 在其循环中达到 1000,我希望第一个进程向另一个进程发送“完成”消息。

我不确定我的方法在流程方面是否正确,我完全不知道如何在这两者之间进行沟通。 任何帮助将不胜感激。

迷失空间

【问题讨论】:

对我来说看起来像是家庭作业。我仍然会给你一个提示:SIGUSR1。 【参考方案1】:

您可能希望为此使用管道。根据进程的启动方式,您需要命名管道或匿名管道:

如果进程彼此独立启动,请使用命名管道(又名 fifo,man mkfifo)。 如果进程是由父进程通过分叉启动的,请使用匿名管道 (man 2 pipe)。父进程将创建管道,子进程将继承它们。这可能是“最漂亮”的解决方案。

在这两种情况下,管道的端点都像任何其他文件描述符一样使用(但更像是套接字而不是文件)。

如果您还不熟悉管道,我建议您阅读 Marc Rochkind 的“高级 UNIX 编程”一书,其中详细解释了这些技术并且易于理解的示例代码。那本书还介绍了其他进程间通信方法(在 POSIX 系统上,唯一真正有用的进程间通信方法是共享内存,但只是为了有趣/完整性,他提出了一些技巧)。

【讨论】:

【参考方案2】:

由于您创建了流程(我假设您使用的是fork()),您可能需要查看eventfd()

eventfd() 提供了一种轻量级的机制来将事件从一个进程或线程发送到另一个。 更多关于eventfd()s 的信息和一个小例子可以在这里找到http://man7.org/linux/man-pages/man2/eventfd.2.html

【讨论】:

【参考方案3】:

如果您只是在寻找一个简单的解决方案,信号或命名管道(因为您要分别启动这两个进程)可能是这里的方法。对于信号,您的客户端进程(发送“完成”的那个)需要知道服务器的进程 ID,对于命名管道,它们都需要知道管道文件的位置以进行通信。

但是,我想指出一个简洁的 IPC/网络工具,如果您正在设计一个更大、更强大的系统,它可以让您的工作变得更加轻松:0MQ 可以让这种客户端/服务器交互变得非常简单,并允许您以您喜欢的任何顺序启动程序(如果您的代码结构正确)。我强烈推荐它。

【讨论】:

以上是关于在进程之间传递消息的主要内容,如果未能解决你的问题,请参考以下文章

使用多处理模块在进程之间传递消息

在两个进程之间传递消息

10-进程之间的通信(共享通信消息传递管道通信)

在远程邮箱处理器之间传递消息?

进程的通信:共享存储消息传递和管道通信

RabbitMQ的5种模式