Linux fork函数与Windows的CreateProcess相比 - 什么被复制?

Vit*_*lii 8 c c++ linux fork

我正在将Windows应用程序移植到Linux.我CreateProcess在Windows上使用它来运行子进程并重定向所有标准流(in,out,error).流重定向很关键,主进程将数据发送给子进程并接收他们的输出和错误消息.主进程非常大,具有大量内存和线程,子进程是小进程.在Linux上,我看到该fork功能具有与CreateProcessWindows 类似的功能.但是,手动说fork"创建父进程副本",包括代码,数据和堆栈.这是否意味着如果我创建一个使用1 GB内存的巨大进程的副本只是为了运行一个使用1 MB内存的非常简单的命令行工具,我将需要与之重复1 GB的内存fork,然后替换这个1 GB的1 MB进程?那么,如果我有100个线程,它将需要100 GB的内存来运行100个需要100 MB内存才能运行的进程?另外,父进程中的其他线程"执行"不知道fork,他们会做什么?什么fork功能"引擎盖下",是否是从巨大的父母创建大量小子进程真正有效的方法?

Ser*_* L. 8

当您打电话时,fork()最初只复制您的VM并且所有页面都标记为copy-on write.您的新子进程将具有父进程VM的逻辑副本,但在您实际开始写入之前,它不会消耗任何额外的RAM.

对于线程,fork在子进程中只创建一个类似于调用线程副本的新线程.

此外,只要您调用任何一系列exec调用(我假设您想要),您的整个过程映像就会被替换为新映像,并且只保留文件描述符.

如果您的父进程有很多打开的文件描述符,那么我建议您通过/proc/self/fd并关闭您不需要的子进程中的所有文件描述符.

  • @Devolus线程:是的,你只收到一个名为`fork`的线程的副本.您将收到其他线程堆栈的copy-on-write副本,但没有执行它们的线程.信号量:取决于它们被放入私人或共享的记忆中.私有内存将提供写时复制页面,因此您的孩子将获得这些页面的副本.共享内存将在父级和子级之间共享. (2认同)