子进程会拷贝父进程的所有资源,变量。但是子进程从父进程拷贝下的所有资源会放到一个新的地址中。父子间共享的内存空间只有代码段。
子进程修改一个从父进程中拷贝下来的变量,父进程中的这个变量不会改变。
- 子进程从父进程拷贝的内容主要有以下
- 用户号UIDS和用户组号GIDS
- 环境Environment
- 堆栈
- 共享内存
- 打开文件的描述符
- 执行时关闭(Close-on-exec)标志
- 信号(Signal)控制设定
- 进程组号
- 当前工作目录
- 根目录
- 文件方式创建屏蔽字
- 资源限制
- 控制终端
-
子进程独有
- 进程号PID
- 不同的父进程号
- 自己的文件描述符和目录流的拷贝
- 子进程不继承父进程的进程正文(text),数据和其他锁定内存(memory locks)
- 不继承异步输入和输出
-
父进程和子进程拥有独立的地址空间和PID参数。
- 子进程从父进程继承了用户号和用户组号,用户信息,目录信息,环境(表),打开的文件描述符,堆栈,(共享)内存等。
- 经过fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈,就像父进程把自己克隆了一遍。事实上,父进程只复制了自己的PCB块。而代码段,数据段和用户堆栈内存空间并没有复制一份,而是与子进程共享。只有当子进程在运行中出现写操作时,才会产生中断,并为子进程分配内存空间。
部分内容参考来自:
https://www.nowcoder.com/questionTerminal/023e148777bc4a8db24ddbe4550285f9?orderByHotValue=1&mutiTagIds=618&page=1&onlyReference=false