我正在将Windows应用程序移植到Linux。在Windows上,我使用CreateProcess
来运行子进程并重定向所有标准流(输入、输出和错误)。流重定向非常重要,主进程向子进程发送数据并接收它们的输出和错误消息。主进程是一个很大的进程,有很多内存和线程,而子进程则很小。在Linux上,我发现fork
函数具有与Windows上的CreateProcess
类似的功能。然而,手册说fork
“创建父进程的副本”,包括代码、数据和堆栈。这是否意味着,如果我创建一个巨大的进程副本,该进程使用1 GB的内存只是为了运行一个占用1 MB内存的非常简单的命令行工具,我需要首先使用fork
复制1 GB的内存,然后用1 MB的进程替换这1 GB?因此,如果我有100个线程,就需要有100 GB的内存来运行需要只占用100 MB内存的100个进程?还有其他不知道fork
执行的父进程中的线程会做什么?fork
函数在幕后究竟做了什么,它真的是从庞大的父进程创建大量小的子进程的有效方式吗?