C fork程序说明

时间:2017-11-02 07:06:29

标签: c fork stdio

我的代码如下

#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 个答案:

答案 0 :(得分:8)

  

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

因为printf()已缓冲。

当进程调用fork()时,生成的子进程将获得父进程缓冲区的副本。

您可以在每次调用fflush(stdout)之前放置fork()来清空此输出缓冲区。在这种情况下,输出应为:

a
b
b
d
c
d
c

请注意,如果输出引用到终端,默认情况下它将是行缓冲,即:每次向输出发送\n时,都会转储缓冲区。如果要将输出重定向到文件,则不是这样。

答案 1 :(得分:4)

当你调用fork()时,它会获得调用进程的输出缓冲区的副本。默认情况下启用缓冲,因此您会收到此行为。 你可以使用

fflush(stdout);

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

禁用缓冲
setbuf(stdout, NULL);

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

答案 2 :(得分:1)

答案已在评论中。您正在拨打<div class="main-panel"> <h1> Good Services Delivery</h1> <div class="parent"> <a class="btn btn-1">Arrival & Emergency</a> <a class="btn btn-2">Obstetric & Gynecology</a> <a class="btn btn-3">WAD</a> <a class="btn btn-4">Ortopedik & Medikal </a> <a class="btn btn-5">Pediatrik</a> <a class="btn btn-6">Mortuary</a> </div> </div>两次。因此解决方案是只调用一次并将结果保存在像public static int countNumbers(int[] sortedArray, int lessThan) { int i = java.util.Arrays.binarySearch(sortedArray, lessThan); if (i < 0) { return -i - 1; } else { // in case of duplicates, find first occurrence for (; i > 0 && sortedArray[i - 1] == lessThan; i--); return i; } } 这样的变量中。此外,您应检查fork-call是否失败(如果失败,则返回负值)。

fork()