【问题标题】:Creating n children to a process为进程创建 n 个子进程
【发布时间】:2014-09-11 00:13:35
【问题描述】:

正如标题所说,我正在尝试为一个进程创建 n 个子进程。我有以下代码和输出。我想在某个地方我允许一个孩子而不是父亲进入循环,但我不知道发生在哪里。或者,我可以考虑另一种情况:父亲是否在所有孩子被创建之前就退出了,而孤儿被另一个进程“收养”?但是,如果是这样,那不应该是初始化过程吗?我是 linux c 的新手,如果第二种情况是错误的,请原谅我,但我有一个类似的程序,父母正在退出,而孩子似乎没有被 init 收养。可能是别的东西,但我要求澄清这一点。我有这些疑问,因为我看不到 1120 进程在哪里创建。非常感谢。

#include <stdio.h>
#include <stdlib.h>

#define N 5

int main()
{
    int pid[N],i=0;

    if ((pid[0]=fork())<0)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else
        if (pid[0]==0)
        {
            printf("I am 0, %d, son of %d\n",getpid(),getppid());
            exit(0);
        }
        else //father
        {
            printf("Father: I am %d\n",getpid());

            int i;
            for (i=1; i<N; i++)
            {
                if ((pid[i]=fork())<0)
                {
                    perror("fork");
                    exit(EXIT_FAILURE);
                }
                else
                    if (pid[i]==0)
                    {
                        printf("I am %d, my #no is %d, son of %d\n",i,getpid(),getppid());
                        exit(0);
                    }
                    //else                        exit(0);
            }
            exit(0);
        }

    return 0;
}

输出:

Father: I am 3213
I am 0, 3214, son of 3213
I am 3, my #no is 3217, son of 1120
danuts@danuts-PC:~/Desktop$ I am 2, my #no is 3216, son of 1120
I am 1, my #no is 3215, son of 1120
I am 4, my #no is 3218, son of 1120

检查进程1120:

danuts@danuts-PC:~/Desktop$ ps -p 1120
PID TTY          TIME CMD
1120 ?        00:00:00 init

我原以为它是一个守护进程.. 但我不知道 init 可能是守护进程,尽管它与终端无关,并且 pid 不是 1。为什么它有那个 pid?我在多重引导中使用 Ubuntu 14.04。

【问题讨论】:

  • 您查看 1120 是什么了吗? -> ps -p 1120
  • 观察力不错。用您建议的检查更新了我的问题。所以,两者兼而有之。它的 pid 不同于 1 的 init,并且父亲确实在其孩子之前退出。

标签: c linux loops process fork


【解决方案1】:

尝试替换注释 // else exit(0);与行'否则等待(NULL);'它会导致父母等待孩子。孤儿进程被“init process”采用。

【讨论】:

  • 那行得通。因为,wait(NULL) 期望任何孩子退出,而不是全部退出,它可能发生在更大的 N 中,创建的进程数小于它,不是吗?
猜你喜欢
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2014-05-11
  • 1970-01-01
  • 2020-07-30
相关资源
最近更新 更多