我创建3个子进程以及为什么它返回7?

时间:2014-10-25 14:33:15

标签: c linux fork

#include <unistd.h>
#include <stdio.h>
int child;
pid_t pid;
        int main(void)
    {
        int i ;
        for(i=0;i<3;i++)
        {
            pid = fork();

            child = getpid();

            if( pid == 0) // child
                printf("Child process %d\n", child);
        }

        return 0;
    }

这是我的代码。每次执行for循环时都会使用fork创建子进程和父进程。我不知道创建了什么进程(子进程或父进程)但我问什么是子进程和打印它的id号。执行代码后,它显示为

Child process:2001
Child process:2002
Child process:2003
Child process:2004
Child process:2005
Child process:2006

4 个答案:

答案 0 :(得分:3)

一张图片胜过千言万语:

enter image description here

答案 1 :(得分:2)

毫无疑问for循环迭代超过3次,但这就是发生的事情

        fork1
        /    \
   fork2      fork3
   /  \        /   \
fork4 fork5  fork6 fork7

因此,您将获得7个值

我屏幕上的输出

Child process 4910
Child process 4911
Child process 4912
Child process 4913
Child process 4915
Child process 4914
Child process 4916

您将获得2 ^ n-1个处理器

在你的情况下2 ^ 3-1 = 8 - 1 = 7。

答案 2 :(得分:0)

fork之后,孩子和父母都会活着,两个人都会执行下一个循环,然后两个人都会分叉......等等。

不清楚你想做什么,但是你可以通过在打印后退出孩子来获得所需的输出。

检查一个类似的问题:Confused with output of fork system call

答案 3 :(得分:0)

将有7次调用fork()。此后总共会有2 ^ 3 = 8个进程。像这样:(数字是流程ID)

// P - parent after fork                            
// c - child after fork              18099
//                               P,18099 c18101
//            P,18099 c18102                             P18101 c18103
//P,18099 c18104        P18102 c18110          P18101 c18105      P18103 c18112

我过去使用此代码对此进行了测试:

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>  
static int *glob_var;
int main(int argc, char** argv) {

    glob_var = mmap(NULL, sizeof *glob_var, PROT_READ | PROT_WRITE, 
                    MAP_SHARED | MAP_ANONYMOUS, -1, 0);
    *glob_var = 0;
    /* fork is called 15 times
     * will create 16 processes
     * parent, 18099 forks 4 times,
     * it's 1st child 18101 forks 3 times
     * it's 2nd child 18102 forks 2 times(1st child of 18102, the 18110 forks 1 time)
     * it's 3rd child 18104 forks 1 time
     * 1st child of 18101, the 18103 forks 2 times
     * 2nd child of 18101, the 18105 forks 1 time
     * 1st child of 18103, the 18112 forks 1 time
     */
    int pid; int i = 0;                                       
    for( i = 0; i < 4; ++i)
        pid = fork();
    sleep(1); printf("fork, pid:%d\n", pid);
    (*glob_var)++;
    fflush( stdout); sleep(1);
    /* I am child, print */
    if( pid==0) printf( "glob_var:%d\n", *glob_var);
    fflush( stdout); sleep(10);
    munmap(glob_var, sizeof *glob_var);
    return (EXIT_SUCCESS);
}