我了解到,在linux fork()
中用于创建新进程。它为子进程分配新内存,然后将数据从父进程复制到子进程,如文件描述符。然后exec()
可用于加载自己的数据并覆盖进程空间。但我想知道是否有必要将父进程的数据复制到子进程?如何直接将子进程的实际数据加载到其进程空间?
答案 0 :(得分:2)
详细了解fork (system call),address space,virtual memory(内核使用MMU),copy-on-write,processes ...
另请阅读Advanced Linux Programming。它有几章解释这些困难的概念。
父进程和子进程有不同的地址空间,但在fork后父进程和子地址空间几乎相等(归功于虚拟内存和写入时复制技术)。唯一的区别是fork(2)系统调用的结果(这几乎是创建进程的唯一方法)
execve(2)完全取代了其调用进程的地址空间(和执行上下文),用于启动新的可执行程序(通常是ELF二进制可执行文件)。
您不需要将数据从父进程复制到子进程。内核正在为你神奇地做这件事。
您可能希望在父母和孩子之间做一些inter-process communication(IPC),通常是通过管道(阅读pipe(7)& pipe(2)& poll(2) ...) , fork
之前设置。您可能想要使用shared memory - 如果您是新手,请避免使用它,因为正确使用它很棘手 - 但您应该关心同步。见shm_overview(7)& sem_overview(7)了解更多信息。
还使用strace(1)并研究某些免费软件shell的源代码(例如sash
或bash
)