创建4个子进程

时间:2017-03-26 13:34:19

标签: c linux process

我想创建4个子进程。我必须在某处做错事。我没有解决它。

我的代码如下。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
    int i;
    int pid[4];
    pid[0]=fork();
    pid[1]=fork();

    for(i=0;i<2;i++){
        if(pid[i] > 0){
            printf("\nI am parent with PID= %d\n",getpid());
            printf("My childs PID is %d\n",pid[i]);
        }
        else if(pid[i] == 0){
            sleep(5);
            printf("********I'm child with PID=%d\n", getpid());
            printf("My parents PID is %d\n", getppid());
        }
        printf("PID %d terminates!!!\n", getpid());

    }

    return 0; }

我试图改变很多东西。儿童过程缺失或产生过多。

我在等你的帮助。 输出:

I am parent with PID= 2531
My childs PID is 2532
PID 2531 terminates!!!
I am parent with PID= 2531
My childs PID is 2533
PID 2531 terminates!!!
I am parent with PID= 2533
My childs PID is 2532
PID 2533 terminates!!!
********I'm child with PID=2533
My parents PID is 1
PID 2533 terminates!!!
********I'm child with PID=2534
********I'm child with PID=2532
My parents PID is 2532
PID 2534 terminates!!!
My parents PID is 1
PID 2532 terminates!!!
I am parent with PID= 2532
My childs PID is 2534
PID 2532 terminates!!!
********I'm child with PID=2534
My parents PID is 1
PID 2534 terminates!!!

1 个答案:

答案 0 :(得分:0)

您的代码已正确创建4个进程:)错误在for循环中。这是一个基于您的代码的程序,它只是在终端上打印正确的输出,在那里可以看到您正确创建了4个进程:

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

int main(void){
    int i;
    int pid[4];
    pid[0]=fork();
    pid[1]=fork();

    if (pid[0] == 0 && pid[1] == 0) {
    printf("I'm the child of the child [%d, parent: %d]\n",getpid(),getppid());
    } else if (pid[0] == 0 && pid[1] != 0) {
        printf("I'm the child [%d, parent: %d]\n",getpid(),getppid());
    } else if (pid[0] != 0 && pid[1] == 0) {
        printf("I'm the child [%d, parent: %d]\n",getpid(),getppid());
    } else if (pid[0] != 0 && pid[1] != 0) {
        printf("I'm the father [%d, parent: %d]\n",getpid(),getppid());
        wait(&i);
        wait(&i);
    } else {
        printf("some error occurred...\n");
    }
    return 0;
}

终端上的输出如下:

  

桌面&gt; PS

     

USER PID PPID PGID TTY STAT命令   emanueleparisi 1481 1480 1481 ttys000 S-bash

     

桌面&gt; ./tmp

     

我是父亲[1745,父母:1481]

     

我是孩子[1747,父母:1745]

     

我是孩子[1746,父母:1745]

     

我是孩子的孩子[1748,父母:1]

希望这对你有用:)

修改

如果你想创建4个子进程(父进程加4个进程,其ppid是父进程),你可以使用这个代码:

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

int main(void){
    int i, tmp;
    pid_t pid[4];

    for (i=0;i<4;i++) {
        pid[i] = fork();
        if (pid[i] == 0) {
            break;
        }
    }

    if (pid[0] != 0 && pid[1] != 0 && pid[2] != 0 && pid[3] != 0) {
        // That's the father, it waits for all the childs
        printf("I'm the father [pid: %d, ppid: %d]\n",getpid(),getppid());
        for(i=0;i<4;i++) {
            wait(&tmp);
        }
    } else {
        // That's the child, it print its pid, its parent pid and exits.
        printf("I'm one of the children [pid: %d, ppid: %d]\n",getpid(),getppid());
    }

    return 0;
}

在我的终端上产生以下输出:

  

桌面&gt; PS

     

USER PID PPID PGID TTY STAT COMMAND

     

emanueleparisi 690 688 690 ttys000 S -bash

     

桌面&gt; ./tmp

     

我是父亲[pid:877,父母:690]

     

我是其中一个孩子[879,父母:877]

     

我是其中一个孩子[880,父母:877]

     

我是其中一个孩子[878,父母:877]

     

我是其中一个孩子[881,父母:877]

如您所见,所有子进程都具有相同的父亲;)