[英]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.