如何使用fork()来创建只有2子进程?(How to use Fork() to create o

2019-06-25 05:25发布

我开始学习一些C和在学习叉,等功能,我到了一个意想不到的输出。 至少对于我来说。

有没有什么方法来创建只有2从父子进程?

在这里我的代码:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main ()
{
    /* Create the pipe */
    int fd [2];
    pipe(fd);

    pid_t pid;
    pid_t pidb;


    pid = fork ();
    pidb = fork ();

    if (pid < 0)
    {
        printf ("Fork Failed\n");
        return -1;
    }
    else if (pid == 0)
    {
        //printf("I'm the child\n");
    }
    else 
    {
        //printf("I'm the parent\n");
    }

    printf("I'm pid %d\n",getpid());

    return 0;
}

这里是我的输出:

I'm pid 6763
I'm pid 6765
I'm pid 6764
I'm pid 6766

请忽略管道的一部分,我还没有得到那么远呢。 我只是想,所以我希望3只创建2子进程“我PID ......”父,我将等待和2子进程,将通过管道沟通仅输出1。

让我知道,如果你看到我的错误是。

Answer 1:

pid = fork (); #1
pidb = fork (); #2

让我们假设父进程ID为100,第一音叉创建另一个进程101.现在,这两个100&101继续#1之后执行的,所以他们执行第二叉。 PID 100到达#2创建的另一过程102的pid 101到达#2创建的另一过程103。因此,我们最终用4个进程。

你应该做的就是这样的事情。

if(fork()) # parent
    if(fork()) #parent
    else # child2
else #child1


Answer 2:

在创建过程后,您应该检查返回值。 如果你不这样做,Seconde系列fork()将由两个父进程和子进程来执行,所以你有四个过程。

如果你想创建2个进程,只是:

if (pid = fork()) {
    if (pid = fork()) {
        ;
    } 
} 

您可以创建n个子流程是这样的:

for (i = 0; i < n; ++i) {
    pid = fork();
    if (pid > 0) {   /* I am the parent, create more children */
        continue;
    } else if (pid == 0) { /* I am a child, get to work */
        break;
    } else {
        printf("fork error\n");
        exit(1);
    }
}


Answer 3:

当叉子语句由母公司执行的,正如你所期望创建一个子进程。 可以说,子进程还执行叉语句,但返回0,父,然而,返回的PID。 叉语句后的所有代码由两个执行,家长孩子。

在你的情况发生了什么事情是,第一叉语句创建一个子进程。 所以目前有一个家长,P1,和一个孩子,C1。

现在,P1和C1都遇到第二个叉声明。 父创建了另一个孩子(C2)如你所期望的,但即使是孩子,C1创建一个子进程(C3)。 所以,实际上你有P1,C1,C2和C3,这就是为什么你有4个print语句输出。

想想一个很好的方法是使用树,代表一个过程中的每个节点,根节点是最高父。



Answer 4:

您可以检查值,好像(PID <0)进程创建不成功此告知用户,如果子进程创建不成功。如果GETPID()从父进程使用fork函数返回子进程的进程ID ..



Answer 5:

您可以创建一个子进程中的一个子进程。 这样你可以有原始父进程的2份。

int main (void) {
    pid_t pid, pid2;
    int status;

    pid = fork();

    if (pid == 0) { //child process
        pid2 = fork();
        int status2;

        if (pid2 == 0) { //child of child process
            printf("friends!\n");
        }
        else {
            printf("my ");
            fflush(stdout);
            wait(&status2);
        }
    }
    else { //parent process
        printf("Hello ");
        fflush(stdout);
        wait(&status);
    }

    return 0;
}

这将打印以下内容:

Hello my friends!


文章来源: How to use Fork() to create only 2 child processes?