fork()为linux中进程复制进程函数,为系统调用fork()的过程大体可分三步 1:申请pid。2:复制pcb。3:复制进程主体。fork()一次会有两个返回值,其中一个返回的给父进程为子进程的PID,另一个返回子进程返回值为0。
1. 因为在fork()时会复制父进程的pcb,Fork之后,子进程会拷贝父进程的PCB结构,然后对PCB里面数据进行修改,父进程的页表直接拷贝给子进程,父子进程共享所有的数据空间,写时拷贝:如果父子进程任意一个进程修改数据时操作系统就会将要修改的数据所在的页直接复制出来,之后把父进程的内核栈复制出来,这就是为什么子进程会在fork()之后的代码开始执行。
2. fork()之后父子进程单独执行,互相独立
3. Fork之前打开的文件描述符:父子进程共享fork之前打开文件的读写偏移量
4. 父进程复制PCB给子进程用的是浅拷贝
5. Pcb在内核中(内核地址空间共享)(内核里面使用的物理地址(用户使用的虚拟地址))
6. 父子全面,局部,堆区数据不共享
7,僵死进程:PCB存在,进程主体释放(子进程先于父进程结束)(子进程结束父进程未获取子进程的退出码,从而子进程不得不保存退出码,所以整个PCB也就无法释放),解决方法:给子进程重新找一个父进程或者父进程通过wait()到子进程的退出码
8. 孤儿进程(没有父进程的子进程):会被init接管,这就是为什么出现僵死进程后父进程结束,子进程解除僵死状态。