【问题标题】:Create multiple child processes in UNIX在 UNIX 中创建多个子进程
【发布时间】:2015-12-23 05:28:33
【问题描述】:

我想编写一个创建N 子进程的 UNIX 程序,这样第一个进程创建一个子进程,然后这个子进程只创建一个作为其子进程的进程,然后该子进程的子进程创建另一个子进程,等等. 这是我的代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int N=3;
    int i=0;

    printf("Creating %d children\n", N);
    printf("PARENT PROCESS\nMy pid is:%d \n",getpid() );
    for(i=0;i<N;i++)
    {
        pid_t pid=fork();
        if(pid < 0)
        {
             perror("Fork error\n");
             return 1;  
        }
        else if (pid==0) /* child */
        {
            printf("CHILD My pid is:%d  my parent pid is %d\n",getpid(), getppid() );
        }
        else /* parrent */
        {
             exit(0);
        }

    }
    return 0;
}

我期望的输出是这样的:

Creating 3 children
PARENT PROCESS
My pid is 1234
CHILD My pid is 4567 my parent pid is 1234
CHILD My pid is 3528 my parent pid is 4567
CHILD My pid is 5735 my parent pid is 3528

我在终端得到的输出是

Creating 3 children
PARENT PROCESS
My pid is:564
CHILD My pid is:5036  my parent pid is 564

User@User-PC ~
$ CHILD My pid is:4804  my parent pid is 1
CHILD My pid is:6412  my parent pid is 4804

问题是程序似乎没有终止。我应该使用Ctrl+C 退出终端,这是不正常的。你能帮我解决这个问题吗?

【问题讨论】:

  • 编译时必须有warning: implicit declaration of function ‘exit’。尝试添加#include &lt;stdlib.h&gt;

标签: c unix operating-system fork


【解决方案1】:

父母死了,孩子也死了。 在您的情况下,父级在创建所有子级之前退出。

尝试在退出之前等待孩子:

    else /* parrent */
    {
        int returnStatus;    
        waitpid(pid, &returnStatus, 0);  // Parent process waits for child to terminate.
         exit(0);
    }

【讨论】:

  • 谢谢您,您的建议可以正常工作并产生所需的输出。但是,我不明白为什么在我的代码中,当父母去世时,孩子们也会死去。据我所知,如果父进程死了,子进程是可能存在的。
  • 第一个进程是否有可能只等待其子进程的结束,而不等待其他子进程的结束?
  • 每个进程在退出之前都会等待它的子进程,因此第一个父进程将最后退出。
  • 好的,谢谢,我明白你的意思了。但是是否可以编写程序以使第一个进程首先终止,他的孩子第二个终止,孩子的孩子第三个终止等等。我应该如何修改代码以使其以这种方式工作?
【解决方案2】:

尝试使用wait(NULL)等待进程;

pid_t child = fork();
if (child == -1)
{
  puts("error");
  exit(0);
}
else if (child == 0)
{
 // your action
}
else
{
 wait(&child);
 exit(0);
}

所以你的父亲会等待子进程退出

【讨论】:

  • 我不明白你的提议和Klas的代码有什么区别。 Klas 使用 waitpid(pid,&returnStatus,0) 并且由于这个命令,parant 等待它的孩子终止。在我看来,当你 wait(NULL) 时,它具有相同的效果。是否有可能第一个进程只等待其子进程的结束,而不等待其他子进程的结束?
  • 这只是另一种选择,我来不及了,
【解决方案3】:

建议的治疗方法是正确的,但陈述的原因是错误的。孩子不会与父母一起死去。线

CHILD My pid is:4804  my parent pid is 1

清楚地表明,到称为getppid() 的孩子时,它的父母已经死了,并且孩子已经重新成为init(pid 1)的父母。

真正的问题是,子进程打印消息后,它继续执行循环,产生更多子进程,使你的程序变成fork bomb

【讨论】:

  • 你能解释一下如何使程序准确地创建指定数量的孩子吗?可能我应该使用 exit(0) 来终止每个孩子的执行。但是当我把 exit(0) 放在孩子的代码中时,程序只创建一个进程而不是 N.
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2014-02-14
  • 2014-05-11
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多