fork函数,僵死进程

fork函数

函数原型:pid_t fork(void);其返回值为 pid_t 类型,实际为int 类型

实现功能:fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。 在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。子进程和父进程代码完全一样,父进程将要执行哪句话,子进程也将执行哪句。我们通过一段代码来理解:

  6 int main()7 {8 char *s=NULL;9 int n=0;10 pid_t pid=fork();  11 assert(pid!=-1);12 if(pid!=0)13 {printf("%d",n);14     s="parent";15     n=6;17 }18 else19 {20 s="child";21 n=3;22 }23 int i=0;24 for(;i

从图中可以看出在第十行调用的fork函数,那么在此时将产生一个子进程。父进程中pid即将接收函数的返回值,子进程也将接收到返回值。此时子进程不会执行fork函数,因为和父进程一样,父进程已经调用结束fork,所以子进程和父进程即将接收返回值。在子进程中返回0(成功)或-1(失败),在父进程中返回子进程的pid。我们将打印出以下结果:

僵死进程

 产生条件:子进程比父进程先结束,父进程没有调用wait函数获取子进程的退出码。

子进程需要父进程进行管理,在子进程结束时,父进程若没有管理会导致pcb被大量浪费,若产生大量的僵死进程,回带来很大的危害。

假设:父进程比子进程先结束,系统会为子进程分配父进程,该养父一定会wait获取子进程的退出码,不会有僵死进程出现。

我们在父进程中加入wait函数,不会产生僵死进程,但是在父进程执行wait获取子进程的退出码时,需要子进程全部结束才能获得子进程的退出码

#include int main(){
char * s = NULL;int n = 0;pid_t pid = fork();assert( pid != -1 );if ( pid == 0 ){n = 4;
s = "child";}else{n = 10;
s = "parent";int val = 0;int id = wait(&val);     //获取退出码,保存在val当中if ( WIFEXITED(val) )
{printf("id=%d,val=%d\n",id,WEXITSTATUS(val));
}
}int i = 0;for( ; i < n; i++ ){printf("pid=%d,s=%s\n",getpid(),s);sleep(1);}exit(3);}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部