关于fork()函数的查漏补缺,赶紧来测测能答对几道题

Posted 从善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于fork()函数的查漏补缺,赶紧来测测能答对几道题相关的知识,希望对你有一定的参考价值。

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

两道测试题

第一题

下题打印多少个 “-” ?

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int i;
    for (i = 0; i < 2; i++) {
        fork();
        printf("-");
    }
    return 0;
}

答案:8个 “-”

第二题

下题打印多少个 “-” ?

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int i;
    for (i = 0; i < 2; i++) {
        fork();
        printf("-\\n");
    }
    return 0;
}

答案:6个 “-”

第三题

下题打印多少个 “-” ?

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int i;
    setbuf(stdout,0);
    for (i = 0; i < 2; i++) {
        fork();
        printf("-");
    }
    return 0;
}

答案:6个 “-”

第四题

下题打印多少个 “-” 以及 “?” 的位置在哪里 ?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
    printf("-");
    write(STDOUT_FILENO,"?\\n",1);
    fork();
    exit(EXIT_SUCCESS);
}

答案:“?–”

再看fork()函数

       关于stdin缓冲区是在进程的用户空间中维护的。因此,通过fork() 创建子进程时会复制这些缓冲区。当标准输出定向到终端时,因为缺省输出为行缓冲,所以会立即显示函数 printf() 输出的包含换行符的字符串。所以,问题二、问题三输出 6个 “-”

       对于没有换行符的 printf() 输出,会保存在stdio缓冲区中,随同fork() 复制给子进程,当进程退出时会刷新缓冲区。所以,问题一输出8个“-”、问题四输出 2个 “-”

       下面解释问题四中,为什么 “?” 在 “-” 之前。write() 的输出结果先于 printf() 而出现,是因为 write() 会将数据立即送到内核高速缓存中,而 printf() 的输出则需要等到调用 “exit(EXIT_SUCCESS);” 才会输出。

如何避免重复输出

  • 作为针对stdin缓冲区问题的特定解决方案,可以在调用fork() 函数之前使用函数 fflush() 来刷新缓冲区。另一种解决方案,也可以使用 setvbuf() 和 setbuf() 来关闭 stdio流的缓冲功能;
  • 子进程可以调用 _exit() 而非 exit() ,以便不再刷新 stdio缓存区。这一技术例证了一个更为通用的原则:在创建子进程的应用中,典型情况下仅有一个进程(一般为父进程)应通过调用 exit() 终止,而其它进程应调用 _exit() 终止,从而确保只有一个进程调用退出处理程序并刷新缓冲区。

以上是关于关于fork()函数的查漏补缺,赶紧来测测能答对几道题的主要内容,如果未能解决你的问题,请参考以下文章

文档流和定位的查漏补缺

API网关你掌握多少了,来个查漏补缺?

查漏补缺:进程间通信(IPC):管道

考察数据科学家支持向量机(SVM)知识的25道题,快来测测吧

2019/5/12 查漏补缺

查漏补缺--python小细节拾遗