dfkt.net
当前位置:首页 >> Linux中子进程执行ExEC后,父进程还需要再wAit这个... >>

Linux中子进程执行ExEC后,父进程还需要再wAit这个...

wait子进程是为了当子进程结束后,获取子进程的相关运行信息和替子进程收尸(也就是清理子进程的PCB),不然子进程会变成僵尸进程,占用系统空间.exec只是把子进程的代码段替换掉,其他的段不变.如果父进程先于子进程结束,init进程会变成子进程的父进程,子进程结束后init会负责清理PCB,但是如果父进程晚于子进程结束,并且父进程也没有wait子进程,那么子进程结束后,它的PCB既不会被父进程清理也不会被init进程清理,浪费系统资源.

等待直到 完成

不. 若父进程退出,子进程尚未结束,则子进程会被init进程领养,也就是说init进程将成为该子进程的父进程. 若希望父进程退出,子进程也退出的话,可以使用线程,因为若进程结束,则还没结束的线程一定会立刻结束.或者如楼上所说,用信号,用a

1. 父进程只等待任何一个进程状态改变,wait就会立即返回.并携带状态改变的子进程信息.如果需要等待所有进程结束,可以wait外面套循环.2. 如果子进程结束后父进程才调用wait/waitpid则不会接收到信息.子进程将变成僵尸进程.

楼主是在看fork函数么?fork函数在linux内核中是一个系统调用封装出来的,这个系统调用的进行的动作简单地说是:创建一个新的进程控制块pcb并进行初始化,申请内存然后复制父进程的运行空间到新的内存空间(确切叫地址空间),然后形成了两个进程,并且子进程的pc指针在fork函数处(**),子进程于是开始在这之后的下一条语句继续执行(大部分是exec函数).所以楼主的问题的答案就是在执行fork之后,自子进程开始执行,是创建处.

回复humjb_1983 谢谢你的回答,你说很精简!自己回复一下,大神们有错快帮我指出来不管vfork 还是fork都需要新的内存页面来保存新进程数据的, vfork创建一个进程空间,但是虽然有空间,但里面什么都没有复制,子进程共享父进程的堆栈

个人理解.vfork调用后,在子进程exec之前父进程阻塞,当子进程exec之后会重新创建相应的地址空间,所以不会覆盖原来父进程的地址空间.fork时复制的mm_struct,在exec时应该会重新利用.vfork的意义并不在于此,关键在于节省了一次地址空间复制的操作.

你说的问题我也不太懂,不过我这有些代码可以给你参考下:建立一个新的进程forkdemo1.c:/* forkdemo1.c * shows how fork creates two processes, distinguishable * by the different return values from fork() */#include main(){ int ret_from_fork,

#include<sys/types.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>int main(void) { pid_t result; result =fork();/*创建进程*/ if(result==-1)/*创建失败*/ { perror("fork"); exit; } else if(result==0)/*子进程*/ { printf("the return value is %d\n in

不可以,只可以更改其nice值(即进程优先级).

相关文档
网站首页 | 网站地图
All rights reserved Powered by www.dfkt.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com