c++ - 克隆/fork、信号量等进程同步算法编程时从哪里开始

标签 c++ process synchronization

我正在编写一个模拟进程同步的程序。我正在尝试在 C++ 中实现 fork 和信号量技术,但开始时遇到了麻烦。我是否只是创建一个流程并从一开始就将其发送到 fork?该程序是否只是一个在父/子进程之间来回的无限循环?以及如何在 C++ 中创建“共享内存”的概念、显式内存地址或只是一些全局变量?我只需要了解程序流程的整体结构/想法。任何引用将不胜感激。

最佳答案

从您的问题中不清楚您的意思是模拟还是您是否试图从 C++ 访问常见的进程同步功能。您对 fork 的引用表明 Linux 是您的目标。

一旦您创建了一个新进程,您并不是在模拟进程同步,而是在使用操作系统的 native 同步功能。

在 Linux 上,要获得共享内存,您可以使用 mmap(可能使用 MAP_ANON)然后调用 fork。生成的内存区域将被共享。您还可以使用 System V 共享内存(名称以“shm”开头的系统调用)。一旦调用 fork,子变量就是父变量的拷贝,但普通的全局变量最终不会共享:子变量得到一个新拷贝。因此需要 mmap 或 shm。

在 Windows 上,没有什么比 fork 更好的了。您必须使用命名共享内存对象或映射文件来建立共享内存。新进程必须进行必要的系统调用以打开共享内存对象或将公共(public)文件映射到其地址空间。

如果您确实想要构建一个模拟器——一个在内部管理进程和共享内存的单一进程,您可能想要从描述 Linux 或 Windows 在该领域的内部工作的各种书籍中挑选一本。

关于c++ - 克隆/fork、信号量等进程同步算法编程时从哪里开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2546865/

相关文章:

c++ - 用于高级综合的任意精度浮点库

c++ - 精神语法解析问题

c# - 你如何取消提升子进程的特权

ubuntu - Jenkins 进程

windows - Dropbox 是如何实现这两个功能的(更改图标和仅发送文件更改的差异。)

postgresql - 插入后同步两个表

c++ - Qt:信号和槽 vs C++:消息传递

c++ - 为什么父/子进程中的对象具有相同的地址?

c++ - 更快地处理 SendARP 函数

c++ - Singleton - 实现。使用静态类成员与静态成员变量