如何防止不同子进程的打印重叠

时间:2016-12-03 14:42:26

标签: c asynchronous process

这是我的第一个问题,所以要温柔:)! 我的代码基本上通过分叉创建了3个进程:

读者 - 负责从标准输入读取三角形并将它们写入两个管道(稍后解释)。

PERI - 负责从管道中读取三角形,计算它们的周长并打印它们。

区域 - 同样,除了该区域。

我的主要为PERI和AREA创建2个管道,以便能够与READER通信。简而言之 - READER获取数据并将其写入两个管道,而AREA和PERI从各自的管道中读取并完成其工作。 此外,在每个进程知道它完成了工作之后......它应该向stderr打印一条消息。 我的问题是消息重叠。

以下是AREA proc的代码。 PERI几乎完全相同:

void startAreaProc(int* readerAreaPipe, int* readerPeriPipe)
{
    struct triangle currTriangle;
    int count = 0;
    int numTriangles = 0;

    close(readerAreaPipe[1]);   //AREA does not write to the pipe
    close(readerPeriPipe[0]);
    close(readerPeriPipe[1]);
    while(1)
    {
        count = read(readerAreaPipe[0], &currTriangle, sizeof(struct triangle));
        if(count == 0)
        {
            break;
        }

        numTriangles++;
        //sleep(1);
        calc_area(&currTriangle);
    }

    close(readerAreaPipe[0]);  //finished reading - cleanup
    //sleep(1);
    fprintf(stderr ,"AREA pid %d processed %d triangles.\n", getpid(), numTriangles);
}

主要问题是AREA和PERI的打印经常重叠...例如,这是1个三角形输入的典型输出: " AREA pid PERI pid 34603488处理过的11个三角形。三角形&#34。 而不是" AREA pid 3460处理了1个三角形。"其次是另一个。

注意 - 我注意到每个三角形的实际周长和区域的打印(不是示例中每个过程结束时打印的信息)不重叠,而那些用printf而不是fprintf打印(最终过程msgs需要转到stderr,这就是我使用fprintf的原因)..

请帮忙???

2 个答案:

答案 0 :(得分:0)

  

注意 - 我注意到每个三角形的实际周长和区域的打印(不是示例中每个过程结束时打印的信息)不重叠,并且打印出来的是printf而不是fprintf

您在此处发布的代码段不会打印任何三角形的区域。我假设AREA打印到管道中,然后READER在屏幕上打印。如果是这种情况,那么你真的不应该期望输出被破坏,因为唯一的程序将这些消息打印到屏幕(READER)是按顺序执行的。

在我看来,当READER关闭管道的写入端时,PERI和AREA会停止。在我看来,最简单的解决方案是让你先关闭PERI的读管,然后等待它再写一个"再见"关闭AREA管道之前,另一个管道上的消息。

答案 1 :(得分:0)

  

注意 - 我注意到每个三角形的实际周长和区域的打印(不是示例中每个过程结束时打印的信息)不重叠,并且用printf打印而不是fprintf ......

如果each(即printf)的行缓冲行为满足您的要求,您可以通过在程序开头写这个来为stdout实现相同的目标:

fprintf(stderr, …)