hua9537 发表于 2012-04-15 13:34

只退出子进程,不退出主进程时,子进程僵死!

如下代码,目的的:退出子进程后,不退出主进程,主进程还需要干其它活。
执行下面代码后,用ps看进程信息时,发现子进程僵死了。如果退出主进程,就没有僵死的子进程了。这是为什么呀?
这种情况下,应该怎么正确退出子进程?#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n = 0;

    pid_t pid;

    pid = fork();

    if(pid)
    {
      printf("This is father\n");
    }else{
      printf("This is child\n");
       //do sth
      return 0;
    }
    while(1)//do sth else;
    return 0;
}

fallavor 发表于 2012-04-15 19:09

子进程执行完之后必须通过主进程调用wait函数回收,否则就会僵死。主进程退出了,子进程的父进程是pid 1的进程,他会帮忙回收退出的进程,所以不会僵死。
man wait,
man waitpid

crazyhadoop 发表于 2012-04-15 20:48

return 。。。这不是函数啊!进程是这么退出的么????

cjdao 发表于 2012-04-16 08:27

回复 3# crazyhadoop
从main return,一个进程结束这个应该没有问题,也可以用exit!

   

cjdao 发表于 2012-04-16 08:29

回复 1# hua9537
建议楼主去了解一下wait或者waitpid这两个函数的作用!

   

GFree_Wind 发表于 2012-04-16 12:37

回复 3# crazyhadoop

也可以这么玩的。。。。

hua9537 发表于 2012-04-16 18:44

cjdao 发表于 2012-04-16 08:29 static/image/common/back.gif
回复 1# hua9537
建议楼主去了解一下wait或者waitpid这两个函数的作用!

在主进程中调用这两个函数,对吧?试过,不可以,子进程还是僵死,等主进程退出后,僵死的子进程也才退出。

fallavor 发表于 2012-04-16 23:35

12.    if(pid > 0)//你没判断pid

13.    {

14.      printf("This is father\n");
            
15.    }else{

16.      printf("This is child\n");

17.       //do sth

18.      exit(0);

19.    }

while(wait(&status)){//wait for exit
if(WISEXITED(status))
    break;
}

//do something

superadminlee 发表于 2012-04-18 18:48

楼主看一下SIGCHILD和wait

hua9537 发表于 2012-05-14 16:04

回复 8# fallavor

我的用法有点太对,我试试!谢谢!
   
页: [1] 2
查看完整版本: 只退出子进程,不退出主进程时,子进程僵死!