我正在移植一个用 C 编写的控制台应用程序,目标是 Linux。我希望使代码尽可能可移植,以便它也可以在 Windows 和其他操作系统上使用。到目前为止,我能够用相应的 C++ stdlib 标头替换所有特定于 Linux 的代码,例如 pthreads、信号量和文件系统操作。
该应用程序的一个特点是作为客户端-服务器架构运行,以允许后台计算并在 CLI 客户端退出时保留和重用状态。我读过各种 IPC 方法,例如套接字、管道和共享内存,但它们总是使用不可移植的系统调用。
有没有办法只使用 C++ 和 stdlib 来实现这一点?我能想到的唯一解决方案是基于文件的通信,但似乎很难保持原子性,尤其是在有多个客户端的情况下,而且服务器必须轮询文件以查看更改,因为所有通知方法似乎也是特定于操作系统的。Stackoverflow上关于它的最新问题已有 15 年历史,因此也许有人在 C++23 及更高版本中提出了一些解决方案来解决这个问题。
截至目前,C++ 语言本身(包括标准库)不支持任何 IPC 机制。
此外,该语言甚至没有进程的概念(C++11 中添加了线程,但没有添加进程)。
您唯一的选择是一些 API/库。
一些可行的选择:
如果您可以使用 boost (被认为具有相当好的可移植性),那么有 2 个相关模块:
(1)
Boost.Interprocess
- 包含许多 IPC 构建块,例如同步对象、共享内存等。(2)
Boost.Asio
- 网络和低级 I/O 库,对套接字有良好的支持。如果您不能使用 boost,您可以使用许多常见操作系统支持的或多或少标准的套接字 API(具有诸如、等功能
bind
)send
。个人观察:
当然,这可能因系统要求等而异,但我发现套接字通常是一种很好的默认方法。它们相对易于管理,在大多数系统上都受支持,性能合理,并且允许您轻松扩展到多台机器。
不,据我所知,较新的 C++ 标准中没有包含任何有关 IPC 的内容。
但是,对于这种情况,您可以使用预处理器编写特定于平台的代码。这也使您的代码与平台无关,因为特定于平台的代码仅在相应的系统上使用。