C Fork()导致打印语句重叠

C Fork()导致打印语句重叠,c,fork,C,Fork,我使用fork来fork多个子进程,但出于某种原因,它们相互重叠,这里就是一个例子 Winning Child (5): 0 Child placed peice at: 6,4 - - - - - - - - Child placed peice at: 2,6 - - - - - - - - Child placed peice at: 4,1 - - - - - - - - Child placed peice at: 6,5 -

我使用fork来fork多个子进程,但出于某种原因,它们相互重叠,这里就是一个例子

Winning Child (5): 0
Child placed peice at: 6,4
 -  -  -  -  -  -  -  - 
Child placed peice at: 2,6
 -  -  -  -  -  -  -  - 
Child placed peice at: 4,1
 -  -  -  -  -  -  -  - 
Child placed peice at: 6,5
 -  -  -  -  -  -  -  - 
Child placed peice at: 3,1
 R  -  -  -  -  -  -  - 
Child placed peice at: 5,4
 R  -  -  -  -  -  -  - 
Child placed peice at: 5,7
 B  B  B  B  -  R  B  R 
 R  R  B  B  R  R  B  B 
Child placed peice at: 2,2
这应该是这样打印的:

Winner Parent
Winning Parent (20): 26181
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 B  -  -  R  -  -  -  - 
 B  -  -  R  B  -  -  - 
 B  -  -  R  B  B  R  R 
 R  R  -  R  R  B  B  B 

当我打印赢牌时,有没有办法停止其他进程停止打印?

在不同进程中重叠打印语句是绝对正常的,因为打印语句同时运行。您可以
wait()
对于希望不与其他进程重叠的进程,但在这种情况下,您将失去并发性


另一种解决方案是使用一些同步机制,如信号量或互斥。使用
sprintf
打印到字符串,然后在该字符串上使用
printf
fflush(stdout)
刷新到io流。这将防止进程交错输出


我相信这个问题是一个更大的问题,你想做什么?您可以将子进程写入另一个文件吗?

您需要在进程之间设置一些通信,以便一个进程可以告诉另一个进程停止打印。我有管道要通信,但由于某些原因,当我告诉它不要打印时,它仍会打印。发布您的代码。在执行特定操作时,您可能没有检查您在哪个进程中。考虑到
fork()
在父进程中返回子进程的pid,在子进程中返回0。将“诊断”输出(子进程的中间结果)直接发送到stderr,并将“真实”结果(父进程)发送到stdout。构建后,您可以选择重定向stderr(例如,重定向到日志文件或/dev/null),或完全忽略它。我正在让我的孩子和家长玩connect-four,当找到赢家时,我打印电路板,这是一个2D int数组。我所描述的将起作用,只需让每个进程在每次
printf
之后刷新流,让父进程使用字符串在内存中生成最终结果,然后在最后打印即可。您可能仍然希望查看命名管道或套接字,以使父子通信脱离stdout和stdin。