0

我应该计算出这段代码来告诉我作业的输出。有人可以帮帮我吗?我不是在寻找答案,而是逐步说明如何理解这一点。

 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); 
 }
4

2 回答 2

1

该代码将打印以下三个选项之一:

值=6
值=8
值=6
值=6
值=8

这取决于哪个write()系统调用首先完成:子进程或父进程,以及子进程是否成功创建(它可能会失败)。

于 2013-03-10T22:17:09.460 回答
-1
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

上面的问题很明显,“分叉前”语句被打印了两次,而它应该只打印一次。

解决方案是

  1. 使用, 在每次调用'\n'后缓冲每一行。printf()

  2. 正如这里正确建议的那样,在分叉fflush(0)之前清空所有 I/O 缓冲区。

于 2013-03-10T22:27:20.353 回答