C - 来自单亲的分叉

时间:2015-11-06 17:16:54

标签: c process fork parent-child

我正在尝试编写一个从单个父进程分发进程的小程序。目前我的代码执行了几次,但是孩子们创建了更多的子进程,我想要消除它们。

int main() {
    pid_t c;

    for (int i = 0; i < 5; i++) { 
        c = fork(); 

        if(c < 0) { 
            perror("fork");
            exit(1);
        }
        else if( c > 0 ) { 
            printf("parentID = %d, childID = %d\n", getppid(i), getpid(i)); 
        }
    }
}

我不知道如何修改它,以便fork只是从父级分叉。

编辑:感谢您的帮助,得到了解决方案:

int main() {
    pid_t c;

    for (int i = 0; i < 5; i++) { 
        c = fork(); 

        if(c < 0) { 
            perror("fork");
            exit(1);
        }
        else if( c > 0 ) { 
            printf("parentID = %d, childID = %d\n", getppid(i), getpid(i)); 
        }

        else {
            exit(0); 
        } 
    } 
}

2 个答案:

答案 0 :(得分:0)

子进程不会进入if块的任何部分,只是循环回到for循环的顶部,从而创建更多子进程。此外,if (n > 0)块将为父项而不是子项运行,因为fork将0返回父项,子项的pid返回父项。

if (n > 0)更改为(n == 0),并在块的底部调用exit()以防止孩子继续。另外,getpid()getppid()不接受任何争论。

int main() {
    pid_t c;

    for (int i = 0; i < 5; i++) { 
        c = fork(); 

        if(c < 0) { 
            perror("fork");
            exit(1);
        }
        else if( c == 0 ) { 
            printf("parentID = %d, childID = %d\n", getppid(), getpid()); 
            exit(0);    // <-- here
        }
    } 
}

答案 1 :(得分:0)

发布的代码中没有任何内容识别孩子(0 == pid)

所以如果儿童击中(并跳过)这两个孩子的话。声明。

点击循环结束,

分支回到循环的顶部,调用fork()....等。

建议:添加

elseif( 0 == pid ) 
{ // then child ...   
    exit( EXIT_SUCCESS );
}