当进程使用fork()
创建子进程时,父进程的哪些内容与子进程共享。如地址空间,记忆,信号等。
注意: - 我已经通过了fork手册。我还需要更多关于它的信息。我也有谷歌它。但我不需要完全了解它。请有人解释我叉子是如何工作的。< / p>
答案 0 :(得分:7)
W. Richard Stevens的Advanced Programming in the UNIX
孩子是一个 父母的副本。例如,子节点获取父节点的数据空间,堆和堆栈的副本。请注意这一点 是孩子的副本;父母和孩子不共享这些记忆部分
fork的一个特征是在父级中打开的所有文件描述符都是 在孩子身上重复。
父级继承了许多其他属性:
1. real user ID, real group ID, effective user ID, effective group ID
2. supplementary group IDs
3. process group ID
4. session ID
5. controlling terminal
6. set-user-ID flag and set-group-ID flag
7. current working directory
8. root directory
9. file mode creation mask
10. signal mask and dispositions
11. the close-on-exec flag for any open file descriptors
12. environment
13. attached shared memory segments
14. resource limits
15. Memory mappings
父母和孩子之间的差异是
1. the return value from fork
2. the process IDs are different
3. the two processes have different parent process IDs—the parent process ID of the child is the parent; the parent process ID of the parent doesn't change
4. the child's values for tms_utime, tms_stime, tms_cutime, and tms_ustime are set to 0
5. file locks set by the parent are not inherited by the child
6. pending alarms are cleared for the child
7. the set of pending signals for the child is set to the empty set
答案 1 :(得分:3)
对史蒂文斯的任何提及通常都是我书中的一个很好的参考。但是,史蒂文斯没有做的一件事就是给出Linux特定的答案,当史蒂文斯写下他的书时,clone
系统调用并不存在。
鉴于您已标记此Linux,我假设您需要Linux特定的答案,您可以使用man clone
找到该答案。这为您提供了可能与fork()
共享的内容的完整列表,因为fork()
是使用clone()
实现的。从内存中,fork()
使用clone()
传递 no 标记(即0
)。因此clone()
的联合帮助页将告诉您它的确切和不复制的内容。