我应该计算出这段代码来告诉我作业的输出。有人可以帮帮我吗?我不是在寻找答案,而是逐步说明如何理解这一点。
int main()
{
int pid;
int val = 5;
pid = fork();
if (pid == 0) val += 3;
if (val == 5) val++;
printf(“val=%d\n”, val);
exit(0);
}
该代码将打印以下三个选项之一:
值=6
值=8 值=6
值=6 值=8
这取决于哪个write()
系统调用首先完成:子进程或父进程,以及子进程是否成功创建(它可能会失败)。
pid = fork();
if (pid == 0) val += 3;
if (val == 5) val++;
printf(“val=%d\n”, val);
案例1:之后fork()
,parent在child之前被调度,并且完成的printf()
调用成功
val = 6; //printed by parent
val = 8; //printed by child
案例 2: 之后fork()
, parent 在 child 之前被安排,并且完成的 printf() 调用成功
val = 8; //printed by child
val = 6; //printed by parent
-- 问题printf()
和fork()
--
#include<stdio.h>
#include <sys/types.h>
int main()
{
printf("Before forking");
pid_t pid = fork();
if (pid == 0)
printf("child printing");
else
printf("parent printing");
}
输出是
term# ./a.out
Before forkingparent printingBefore forkingchild printing
上面的问题很明显,“分叉前”语句被打印了两次,而它应该只打印一次。
解决方案是
使用, 在每次调用'\n'
后缓冲每一行。printf()
正如这里正确建议的那样,在分叉fflush(0)
之前清空所有 I/O 缓冲区。