一般的fork后子进程会获得父进程数据空间,堆,栈的副本。子进程改变这些并不会影响父进程。父子进程共享的是正文段。
但是fork之后复制这些区域给子进程会降低一些性能,所以出现了写时复制(Copy-On-Write COW),只有当父子进程中任意一个想改变其中一个区域时,内核就为那部分区域制作一个副本。后来又出现了vfork函数,vfork后的子进程在exec或exit之前都会一直在父进程空间中运行,所以它能够改变父进程状态
fork后子进程会拷贝父进程的缓冲区,包括缓冲区状态(_IOFBF,_IOLBF,_IONBF)。其实,fork后子进程会获得父进程的所有打开文件描述符,父子进程间相同的描述符共享文件表项(也就是它们处理的是同一文件且在同一状态)。
除了打开文件外,子进程也继承如下父进程的属性:
实际用户ID,实际组ID,有效用户ID,有效组ID
附加组ID
进程组ID
会话ID
控制终端
设置用户ID标志和设置组ID标志
当前工作目录
根目录
文件模式创建屏蔽字
信号屏蔽和安排
针对任一打开文件描述符的在执行时关闭标志
环境
连接的共享存储段
存储映射
资源限制
阅读(969) | 评论(0) | 转发(0) |