关于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()函数的查漏补缺,赶紧来测测能答对几道题的主要内容,如果未能解决你的问题,请参考以下文章