在创buildsubprocess时,是否需要将父进程的数据复制到subprocess?

我了解到,在linux fork()中用来创build一个新的进程。 它为subprocess分配新的内存,然后将数据从父进程复制到subprocess,如文件描述符。 然后exec()可以用来加载自己的数据并覆盖进程空间。 但是我想知道是否需要将父进程的数据复制到subprocess? 将subprocess的实际数据直接加载到进程空间如何?

详细了解fork(系统调用) , 地址空间 , 虚拟内存 (内核正在使用MMU ), 写时复制 , 进程 …

另请阅读高级Linux编程 。 它有几个章节解释这些困难的概念。

父进程和子进程具有不同的地址空间,但在fork之后,父子地址空间几乎相等(由于虚拟内存和写时复制技术)。 唯一的区别是fork(2)系统调用的结果(这几乎是创建进程的唯一方法)

execve(2)完全替代了调用进程的地址空间(和执行上下文),用来启动一个新的可执行程序(通常是一个ELF二进制可执行文件)。

你不需要从父母到孩子的过程中复制数据。 内核对你来说是神奇的。

您可能希望在父子之间进行一些进程间通信 (IPC),通常通过管道(读取管道(7)和管道(2)和轮询(2) …)在fork 之前进行设置。 你可能想要使用共享内存 – 如果你是一个新手,就避免使用共享内存 ,因为使用正确的代码很棘手 – 但是你应该关心同步。 有关更多信息,请参阅shm_overview(7)和sem_overview(7) 。

也可以使用strace(1)和学习一些免费软件shell(如sashbash )的源代码,