如何使用fork()了解代码中的输出? #包括 #包括 int main() { W(A); int child=fork(); W(B); 如果(儿童) 等待(空); W(C); }

如何使用fork()了解代码中的输出? #包括 #包括 int main() { W(A); int child=fork(); W(B); 如果(儿童) 等待(空); W(C); },c,unix,fork,C,Unix,Fork,我认为ABBCC将是其中一个输出,但也是下一个输出中的一个:ACCBB、ABB、ABCBC、ABCAA应该是正确的。W表示写,W(A),W(B),W(C)表示写A,B,C。请帮忙 ACCBB不可能 我将为家长打印的字母添加下标p,为孩子添加下标c 父进程按该顺序打印ApBpCp,子进程按该顺序打印BcCc Ap将首先打印,因为它是在任何东西分叉之前打印的。父级在打印Cp之前等待子级退出,因此必须排在最后。这意味着第一个和最后一个字符是A和C 在这两者之间,两个进程之间的执行顺序没有约束。因此,以

我认为ABBCC将是其中一个输出,但也是下一个输出中的一个:ACCBB、ABB、ABCBC、ABCAA应该是正确的。W表示写,W(A),W(B),W(C)表示写A,B,C。请帮忙

ACCBB
不可能

我将为家长打印的字母添加下标p,为孩子添加下标c

父进程按该顺序打印ApBpCp,子进程按该顺序打印BcCc

Ap将首先打印,因为它是在任何东西分叉之前打印的。父级在打印Cp之前等待子级退出,因此必须排在最后。这意味着第一个和最后一个字符是
A
C

在这两者之间,两个进程之间的执行顺序没有约束。因此,以下是可能的:

BpBcCc
BcBpCc
BcCcBp

前两个在输出上看起来是一样的,因为我们无法区分Bp和Bc之间的区别

因此,可能的结果是:

#include <unistd.h>
#include <sys/wait.h>
int main ()
{
    W(A);
    int child=fork();
    W(B);
    if (child)
      wait(NULL);
    W(C);
}

这一切都假设没有可能延迟输出的缓冲。也就是说,这只是一个检查并发进程中语句执行顺序的练习,而不是关于I/O。

这一切都取决于缺少的信息-宏
W
是什么,然后可能是
A
B
C
代表什么。这不是一个MCVE()-它缺少关键信息,因此它是次最小值且不完整的,因此无法验证。(说“
W
意味着写,…”是没有帮助的;我们需要看看
W
是如何定义的。有很多有趣的事情可以做错事。)你问的问题也不完全清楚。您是否在询问输出将是什么,或者可以是什么?正如所写的,代码不会编译。您省略了W的定义。根据您是否有
#define W(x)write(0,#x,1)
#define W(x)putchar(#x[0])
#define W(x)fwrite(#x,1,1,stdout)
等,您选择了或获得了许多可用选项中的哪一个?函数:
fork()
返回三(3)种值:1)>0表示在父对象中;2)==0表示在子对象中;3)如果输出机制使用标准I/O(
#define W(x)putchar(#x[0])
),则除非关闭缓冲(例如
setbuf(stdout,NULL)
),否则将打印两个A。这可能不是正在使用的,但OP拒绝提供MCVE是令人恼火的。(否则,很好地介绍了分析。)正如我在上一段中所说,我认为这只是一个占位符,可以是任何语句,因为这是一个理解多个进程如何工作的练习,而不是I/O。是的,它是关于多个进程如何工作的,并且只给出了我写的内容。给出的答案中有两个是正确的,它们是ABBCC和ABCBC。所以Barmar非常感谢。如果你想看到一个更复杂的挑战,我无法计算出完整的结果,
ABBCC
ABCBC