标签:文件 ext 执行 占用 enc 分配 独立 初始化 com
fork 后子进程对父进程的继承
(1)为什么需要创建子进程?
每一个程序的运行都需要进程,创建子进程可以实现宏观上的并行
(2)什么时候需要创建子进程?
当父进程执行到某个阶段,或接收到某个事件后,需要创建一个独立的进程来协助其完成任务时,才需要调用fork创建一个新进程
(3)子进程对父进程的继承
1.为什么要继承父进程的相关资源,参考 http://blog.csdn.net/xlsernt_sina_com/article/details/31350829
摘选了两句话:
父进程创建子进程是为了其能够协助父进程完成某些操作,因此,父进程必须将其自己的一些资源分享给子进程,以便父子进程共同完成任务
子进程的创建是为了协助父进程完成相关任务,与此目的不相关的资源,子进程没有必要继承,继承了自会白白浪费内存资源
2.继承的资源, 参考 http://blog.chinaunix.net/uid-24517549-id-4117366.html
3.不继承的资源
4.其他需要注意的
1.父进程和子进程拥有独立的地址空间和PID参数
2.经过fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈(共享内存)
3.就像父进程把自己克隆了一遍。事实上,父进程只复制了自己的PCB块。而代码段,数据段和用户堆栈内存空间并没有复制一份,而是与子进程共享。只有当子进程在运行中出现写操作时,才会产生中断,并为子进程分配内存空间。由于父进程的PCB和子进程的一样,所以在PCB中断中所记录的父进程占有的资源,也是与子进程共享使用的。这里的“共享”一词意味着“竞争”
(4)fork的返回值
fork函数调用一次会返回2次,首先返回pid = 0,返回值等于0的就是子进程;再返回pid 大于0,返回值大于0的是父进程,且这个返回值就是本次 fork创建的子进程ID
(5)父进程对子进程的回收
1.孤儿进程:父进程先结束的时候,系统会把init进程(进程1)变为子进程的父进程
2.僵尸进程:子进程先于父进程结束,父进程还未来得及将其收尸(系统只是回收了这个进程工作时消耗的内存和IO,而并没有回收这个进程本身占用的内存,8KB,主要是task_struct和栈内存))
3.回收函数
wait:阻塞,子进程结束时,系统向其父进程发送SIGCHILD信号 pid_t wait(int *status);
参考 http://blog.csdn.net/qq_18973645/article/details/52648812
waitpid:可以回收指定PID的子进程,可以阻塞式或非阻塞式两种工作模式
pid_t waitpid(pid, &status, 0); //0默认表示阻塞
pid_t waitpid(pid,&status,WNOHANG) //表示非阻塞
标签:文件 ext 执行 占用 enc 分配 独立 初始化 com
原文地址:http://www.cnblogs.com/Deanboy/p/7525112.html