C++中的进程间通信

Posted

技术标签:

【中文标题】C++中的进程间通信【英文标题】:Interprocess Communication in C++ 【发布时间】:2009-08-27 20:40:15 【问题描述】:

我有一个简单的 C++ 应用程序,可以在我的 Web 应用程序的后端生成报告(简单的 LAMP 设置)。问题是后端加载了一个需要大约 1.5GB 内存的数据文件。如果多个用户同时运行它,这将不会很好地扩展,所以我的想法是分成几个程序: 程序 A 是始终在服务器上运行的主要可执行文件,始终加载数据,并且可以实际运行报告。 程序 B 是从 php 产生的,它向程序 A 发出一个简单的请求以获取它所需的信息,并返回数据。 所以我的问题是: 什么是 B 要求 A 做某事的好机制? 当A无事可做时,它应该如何工作?我真的不想轮询任务或以其他方式旋转我的轮胎。

【问题讨论】:

对不起...这一切都在 Linux 中运行。 我添加了 linux 标签,因为你提到了 LAMP。 IPC 依赖于平台,因此这很重要。 【参考方案1】:

使用命名的互斥体/事件,基本上它的作用是允许一个线程(在您的情况下为进程 A)坐在那里等待。然后进程 B 出现,需要完成一些事情,并向互斥体/事件发出信号,这会唤醒进程 A,然后您继续。

如果你在微软:

Mutex, Event

Linux 上的 Ipc 工作方式不同,但功能相同:

Linux Stuff

或者,对于 c++ 部分,您可以使用多平台的 boost IPC 库之一。我不确定 PHP 有什么可用的,但毫无疑问会有等价的。

【讨论】:

+1 不需要打网卡,特别是如果你在同一个盒子上运行网络服务器。 +1 用于提及提升进程间。 boost.org/doc/libs/1_39_0/doc/html/interprocess.html 谢谢!我想我将使用一对 Boost 消息队列。 @windfinder 在 localhost 上通信不涉及网卡。我对 Boost IPC 的了解不够多,无法给出 + 或 - 并且我在粗略的搜索中找不到太多信息。 GLHF “Linux Stuff”链接已失效。【参考方案2】:

使用在localhost 上运行的 TCP 套接字。

    使 C++ 应用程序成为守护程序。 PHP 前端创建与守护程序的持久连接。 pfsockopen 当发出请求时,PHP 会向守护程序发送一个请求,然后由守护程序处理并将其全部发回。 PHP SocketsC++ Sockets

编辑

添加了一些链接供参考。我可能有一些非常糟糕的 C 代码在某处使用进程间通信的套接字,但没有什么好用的。

【讨论】:

这看起来很有趣。但对我来说听起来很陌生。您知道使用中的任何好的参考资料或示例吗?【参考方案3】:

IPC 在 C++ 上很简单,只需调用 POSIX C API。

但是,队列管理器可以更好地满足您的要求。让后台守护进程等待队列中的消息,前端 PHP 只需在其中添加它要处理的任务的规范。一些队列管理器允许将任务结果添加到同一个对象,或者您可以为完成消息定义一个新队列。

最著名的高性能队列管理器之一是RabbitMQ。另一个非常好用的是MemcacheQ。

或者,您可以只为 mysql 添加一个表来执行任务,后台进程只是定期查询未完成的任务。这很有效,而且非常可靠(有时称为 Ghetto 队列),但在高任务/秒时会崩溃。

【讨论】:

是的,我确实想使用消息队列。当没有消息时,它将允许后台进程阻塞,否则会很好地工作。谢谢!

以上是关于C++中的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中是不是有用于远程进程间通信的 API?

Linux C与C++一线开发实践之四 Linux进程间的通信

Linux C与C++一线开发实践之四 Linux进程间的通信

在 C 中的进程间通信中传递结构

进程间通信的问题(C++高手进)

c++ 线程间通信方式