我有一个进程,分叉,执行计算并将数据写入stdout。子进程还在执行某些计算后将数据写入stdout。目前,父母和孩子的输出分别出来。但是,我担心孩子的输出可能会与父母的输出混合打印出来。
即。我在孩子和过程中都有这一行: -
fprintf(stdout, "%s\n", do_computation());
有没有任何简洁的方法来阻止写入交错?到目前为止还没有发生过,但是我担心它可能会发生。
答案 0 :(得分:1)
这是标准的多任务问题,并且以与保护任何其他共享资源相同的方式解决:您有责任创建和管理信号量,以便进程可以协商对共享资源(例如这些流)的独占访问时段,或者安排类似的安全机制让他们在他们自己之间进行通信(例如,让子进程响应不是stdout,而是通过每个进程的管道回到父进程,并让父进行轮询,并在完整消息可用时报告结果)。 / p>
在C上进行多进程编程时,网上应该有很多很好的教程。
答案 1 :(得分:1)
从概念上讲,您希望在不同的进程中为fprintf调用实现之前或之后的原子性。您可以在父进程中,在fprintf调用之前等待子进程的waitpid,以便保证在子进程终止后执行父进程中的调用,而不会降低计算的并行性。