【问题标题】:C - Forking from a single parentC - 从单亲分叉
【发布时间】:2015-11-06 17:16:53
【问题描述】:

我正在尝试编写一个小程序,从单亲派生进程。目前我的代码执行了几次,但随后孩子们创建了更多的子进程,我想消除这些。

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); 
        } 
    } 
}

【问题讨论】:

  • 1) 变量“n”应该是什么?它没有定义。建议使用“pid_t”变量中的值。 2)问题是关于运行时问题,但发布的代码无法编译。请贴出真实代码。

标签: c process fork parent-child


【解决方案1】:

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

所以一个孩子点击(并跳过)两个“if”语句。

循环结束,

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

建议:添加

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

【讨论】:

    【解决方案2】:

    子进程不进入if 块的任何部分,只是循环回到for 循环的顶部,创建更多子进程。此外,if (n &gt; 0) 块将针对父级而不是子级运行,因为fork 将 0 返回给父级,将子级的 pid 返回给父级。

    if (n &gt; 0)改为if(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
            }
        } 
    }
    

    【讨论】:

    • 没有 OPs 代码对孩子做任何事情 (0 == pid) 这个答案对孩子没有任何作用。此答案中未定义变量“n”
    • 第n个问题是我的错,我原来不小心写了n而不是c,现在才发现修改了。
    • @user3324536 您的解决方案不会打印您期望的 pid。 printf 应该在子块中,getpidgetppid 不带任何参数。
    猜你喜欢
    • 2013-03-09
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多