C ++:与另一个应用程序通信的最常见方式

时间:2010-03-17 16:17:03

标签: c++ api

在裸露的大纲中,我有一个应用程序在启动时查看目录并创建特殊文件的索引 - 之后它就像守护进程一样工作。另一个应用程序创建这样的“特殊”文件并将它们放在某个目录中。通知第一个应用程序有关新文件(索引它)的方法是最常见,最简单(第一个是运行时,所以它不应该减慢太多),如果可能的话,跨平台?

我看过RPC和IPC,但它们太重了(也是非跨平台和慢(需要很多功能才能工作 - 我需要一个简单的轻松工作方式),可能)。

6 个答案:

答案 0 :(得分:7)

管道是一种选择:请参阅Network Programming with Pipes and Remote Procedure Calls(Windows)或Creating Pipes in C(Unix)。

我有一段时间没有这样做,但根据我对RPC,DCOM,COM,.NET Remoting和套接字编程的经验,我认为管道是最直接和最有效的选择。

答案 1 :(得分:1)

对于Windows(NTFS),您可以从操作系统获得有关目录已更改的通知。但它不是crosspl。而不是两个应用程序。

“IPC,但它们太重了” - 不,不,它们根本不重。你应该看一下命名管道 - 这个IPC是最快的,它与Win / Unix一样,略有不同。或插座!

答案 2 :(得分:1)

eisbaw建议使用TCP。我会说,为了使它更简单,使用UDP。 创建一个监听线程,它将接收数据包,并从那里处理它 - 在所有应用程序上。

由于它在同一台PC上,你永远不会丢失任何数据包,这是UDP在网络上可能会错误地做的事情。

每个应用程序实例都需要一个特殊端口,但这很容易配置您(我假设)已经拥有的配置文件。

保持简单(:

答案 3 :(得分:0)

本地TCP套接字保证可以正常工作 - 正如Andrey

所提到的那样

共享内存将是另一种选择,请看一下 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2044.html

答案 4 :(得分:0)

正如安德烈指出的那样,如果您提前就完整路径达成一致,您可以让操作系统告诉您何时添加。所有主要平台实际上都以某种形式支持这一点您可以使用跨平台库,例如QFileSystemWatcher

编辑:我认为QFileSystemWatcher不会造成太大的性能损失。它绝对依赖于Linux,FreeBSD和Mac OS(我认为是Windows)上的通知的底层操作系统。见http://qtnode.net/wiki/QFileSystemWatcher

答案 5 :(得分:0)

内存映射文件,套接字和命名管道都是高效,跨平台,ipc机制。好吧,访问命名管道和内存映射文件的api在POSIX和Win32之间有所不同,但基本的机制很相似,很容易制作跨平台包装器。套接字和命名管道往往很快,因为在进程间情况下,OS开发人员(大多数常见操作系统)都内置了快捷方式,这实际上使得套接字/命名管道编写了一个相当简单的内存部分包装。