代码之家  ›  专栏  ›  技术社区  ›  jackson

C fork程序说明

  •  3
  • jackson  · 技术社区  · 7 年前

    我有一个代码如下

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
        printf("a\n");
        fork();
    
        printf("b\n");
        if(fork() == 0) {
            printf("c\n");
            exit(0);    
        }
        printf("d\n");
        return 0;
    }
    

    输出:

    a
    b
    d
    a
    b
    c
    a
    b
    d
    a
    b
    c
    

    我不知道为什么输出重复了很多次。

    3 回复  |  直到 7 年前
        1
  •  8
  •   jfMR    7 年前

    我不知道为什么输出重复了很多次

    因为 printf() 已缓冲。

    fork()

    您可以通过放置 fflush(stdout) 就在每次呼叫之前 分叉() . 在这种情况下,输出应为:

    a
    b
    b
    d
    c
    d
    c
    

    线路缓冲 默认情况下,即:每次 \n 发送到输出。如果将输出重定向到文件,则情况并非如此。

        2
  •  4
  •   Lakshmikant Deshpande    7 年前

    当你打电话的时候 fork() 它获取调用进程的输出缓冲区的副本。默认情况下启用了缓冲,因此您可以获得这种行为。 您可以使用

    fflush(stdout);
    

    在调用fork()之前。或者,您也可以使用禁用缓冲

    setbuf(stdout, NULL);
    

    您可以阅读有关fork的更多信息 here . 如果你需要更多帮助,请告诉我。

        3
  •  1
  •   Fränki    7 年前

    答案已经在评论中了。你在打电话 fork() 两次所以解决方案是只调用它一次,然后将结果保存在这样的变量中 int pid = fork() . 此外,您应该检查fork调用是否失败(如果失败,则返回负值)。

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
        printf("a\n");
    
        int pid = fork();
        if (pid < 0)
        {
            fprintf(stderr, "Can't fork!");
            exit(1);
        }
    
        printf("b\n");
    
        if(pid == 0)
        {
            printf("c\n");
        }
        else
        {
            printf("d\n");
        }
    
        return 0;
    }