我想这个问题说明了一切。
我想在Windows上进行分叉。什么是最相似的操作以及如何使用它。
最佳答案
Cygwin在Windows上具有全功能的fork()。因此,如果您可以接受使用Cygwin,那么在性能不成问题的情况下解决了该问题。
否则,您可以看看Cygwin如何实现fork()。从相当古老的Cygwin架构doc:
5.6。流程创建
Cygwin中的fork调用特别有趣
因为它不能很好地映射到
Win32 API。这使得它非常
难以正确实施。
目前,Cygwin前叉是
非写时复制实现
类似于早期的情况
UNIX风格。
当
父进程派生一个子进程
是父母初始化一个空格
在Cygwin流程表中
儿童。然后创建一个暂停
使用Win32的子进程
CreateProcess调用。接下来,父母
进程调用setjmp保存自己的
上下文并为此设置一个指针
Cygwin共享内存区域(共享
在所有Cygwin任务中)。然后填充
在孩子的.data和.bss部分中
通过从其自己的地址空间复制
进入孩子的住所
空间。在孩子的地址空间之后
被初始化,孩子在
父母等待互斥。孩子
发现它已经分叉了
使用保存的跳转缓冲区进行longjumps。
然后,孩子将互斥锁设置为
父母正在等待,并阻止
另一个互斥体。这是信号
父级复制其堆栈和堆
进入孩子,之后
释放孩子的互斥体
等待并从叉子返回
呼叫。最后,孩子从
在最后一个互斥体上阻塞,重新创建
传递给它的所有内存映射区域
通过共享区域,然后从
叉子本身。
虽然我们对如何
通过以下方式加快分叉实施
减少上下文数量
在父子之间切换
过程中,叉子几乎可以肯定
在Win32下始终效率低下。
幸运的是,在大多数情况下
产生由提供的呼叫系列
Cygwin可以代替
前叉/高管对只有一点点
努力。这些调用清晰地映射在顶部
Win32 API。结果,他们
效率更高。改变
编译器的驱动程序要调用
产生而不是叉子是微不足道的
变化和增加编译
速度提高百分之二十到百分之三十
我们的测试。
但是,spawn和exec显示了他们的
自己的困难。因为那里
是没有办法做一个实际的执行
Win32,Cygwin必须发明自己的
进程ID(PID)。结果,当
一个进程执行多个执行
通话,会有多个Windows
与单个Cygwin相关的PID
PID。在某些情况下,每个
这些Win32进程可能会持续存在,
等待他们的执行长Cygwin
退出过程。
听起来需要做很多工作,不是吗?是的,它是slooooow。
编辑:该文档已过时,请查看此优秀的answer以获取更新
关于c++ - Windows最接近fork()的东西是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48925070/