首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我的fork()不派生一个子对象并输出print语句?

为什么我的fork()不派生一个子对象并输出print语句?
EN

Stack Overflow用户
提问于 2019-03-28 01:37:29
回答 1查看 365关注 0票数 0

我正在用Ubuntu编写一个c程序,并且在代码中我使用fork()来生成5个不同的子代。但是,当我编译和运行我的程序时,没有创建子程序,并且我放在三个if语句(对于case fork() == 0,> 0,< 0)中的printf("Test")只在>0中,在printf语句的输出中。

实际上,不久前,fork()运行得还不错,但在我继续我的程序工作后,它突然不能工作了。

为什么会发生这种情况?我应该如何修复它?

代码语言:javascript
复制
for (i = 0; i < proc; ++i){
    printf("In for %d",i);
    // TODO
    int fork_result = fork();
    if (fork_result == 0){ // Create child process
        child_pids[i] = getpid();
        printf("Test 5");
        printf("In if %d",i);
        break;
    }
    else if(fork_result < 0){
      printf("Fork failed");
    }
    else if (fork_result > 0){
      printf("Parent");
    }
}

那么,预期的结果是它将包含“测试5”或"In if“

实际输出:

代码语言:javascript
复制
In for 0In for 1In for 2In for 3In for 4

实际输出不包含任何“测试5”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 03:44:03

子进程继续执行调用者的代码。调用方很可能不希望执行父级和所有子级。在此之前,您应该退出该子进程:

代码语言:javascript
复制
for (i = 0; i < proc; ++i){
    printf("In for %d",i);
    fflush(stdout); // <--- here
    // TODO
    int fork_result = fork();
    if (fork_result == 0){ // Create child process
        child_pids[i] = getpid();
        printf("Test 5");
        printf("In if %d",i);
        exit(0);  // <---- must have this
        break;
    }
    else if(fork_result < 0){
      printf("Fork failed");
    }
    else if (fork_result > 0){
      printf("Parent");
    }
}
// without the exit above the child will execute this code:
Some code

您必须刷新stdout,否则子进程和父进程共享缓冲区中相同的前缀文本,并且当最后刷新时,两者都将打印相同的前缀。最终,这种分享会让任何试图分析输出的人感到困惑。

注意:一旦有exit调用,标准输出将被正确刷新。

另外,请注意,不同的打印输出可能是交错的。将它们放在不同的行中,并使用不同的前缀(如i和/或pid)可以帮助调试。

看看this run example

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55383409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档