2013-03-04 71 views
0

我使用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 

有沒有辦法阻止其他進程停止其印刷當我打印中獎板?

+3

您需要在進程之間設置一些通信,以便一個進程可以告訴其他進程停止打印。 – 2013-03-04 21:33:36

+0

我有管道溝通,但由於某種原因,它仍然打印時,我不告訴它。 – jg943 2013-03-04 21:35:12

+0

發佈您的代碼。也許你在做特定的操作時不檢查你是哪個進程。考慮到'fork()'返回父進程中子進程的PID,子進程返回0。 – niculare 2013-03-04 21:38:19

回答

0

使用sprintf打印到一個字符串,然後使用該字符串上的printffflush(stdout)刷新到io流。這將保持交錯輸出的過程。

我相信這個問題是一個更大的問題,但你想做什麼?你可以將子進程寫入另一個文件嗎?

+0

我有我的孩子和父母玩連接四,當發現贏家我打印董事會,這是一個二維詮釋數組。 – jg943 2013-03-04 21:40:58

+0

我所描述的將會起作用,只需讓每個進程在每個'printf'使用一個字符串在內存中建立最終結果後刷新流,然後在最後打印。您可能仍然希望查看命名管道或套接字以將父級子通信從標準輸出和標準輸入中刪除。 – hwatkins 2013-03-04 21:54:55

2

因爲在同一時間運行,在不同的進程中重疊打印語句是絕對正常的。您可以wait()爲您想不打印與其他進程重疊的進程,但在這種情況下,您將失去併發性。

另一種解決方案是使用一些同步機制,例如信號量或互斥量。