簡體   English   中英

如何防止不同子進程的打印重疊

[英]How can I prevent the printings of different child processes from overlapping

這是我在這里的第一個問題,所以要輕柔:) 我的代碼基本上通過分叉創建了3個進程:

READER-負責從stdin讀取三角形並將它們寫入兩個管道(稍后說明)。

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個三角形。” 而不是“ AREA pid 3460處理了1個三角形”。 其次是其他。

注意-我注意到每個三角形的實際周長和區域的打印(不是示例中每個過程末尾打印的味精)沒有重疊,並且這些打印是用printf而不是fprintf(末尾-process msgs需要轉到stderr,這就是我使用fprintf的原因。

請幫助???

注意-我注意到每個三角形的實際周長和區域的打印(不是示例中每個過程末尾打印的消息)不重疊,並且這些打印是用printf而不是fprintf進行的

您在此處發布的代碼段不會打印任何三角形的區域。 我假設AREA打印到管道中,然后READER在屏幕上打印。 如果是這種情況,那么您就不應該期望輸出會受到干擾,因為唯一將這些消息打印到屏幕(READER)的程序是按順序進行的。

在我看來,當READER關閉管道的寫側時,PERI和AREA停止。 在我看來,最簡單的解決方案是讓您先關閉PERI的讀取管道,然后在關閉AREA的管道之前等待它在另一個管道上寫入“再見”消息。

注意-我注意到每個三角形的實際周長和區域的打印(不是示例中每個過程末尾打印的消息)不重疊,並且這些打印是用printf而不是fprintf進行的 ……

如果printf的行緩沖行為(即stdout )滿足您的要求,則可以通過在程序開始時編寫以下代碼來實現fprintf(stderr, …)的相同功能:

    setvbuf(stderr, NULL, _IOLBF, BUFSIZ);      // make stderr line buffered

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM