2016-11-30 113 views
0

我的作業任務是編寫一個C程序,該程序創建4個子進程,每個子進程必須使用整數進行處理並將其發送給另一個執行其他操作的子進程它和最後一個必須打印更改的值。我必須使用匿名管道來進行孩子之間的溝通。家長過程除了爲孩子打開管道之外沒有別的工作。我已經編寫了這個程序,但問題是當我嘗試使用最後一個孩子打印數字時,我得到了有趣的輸出。它打印出8個數字而不是1個(實際上其中一個是正確的)。代碼的一部分如下:使用管道在子進程之間傳遞數據C

int pipe1[2]; 
int pipe2[2]; 
int pipe3[2]; 
pipe(pipe1); 
pipe(pipe2); 
pipe(pipe3); 

int j; 

close(pipe1[1]); //close pipes for writing on parent process 
close(pipe2[1]); 
close(pipe3[1]); 

for (j = 0; j < 4; j++) { 
    switch(fork()) { 
    case 0: 
     if (j == 0) { 
      int value = 100; 
      write(pipe1[1], &value, sizeof(int)); 
      close(pipe1[1]); 
     } 
     else if (j == 1) { 
      int value; 
      read(pipe1[0], &value, sizeof(int)); 
      close(pipe1[0]); 
      value = value * 10; 
      write(pipe2[1], &value, sizeof(int)); 
      close(pipe2[1]); 
     } 
    //and so on until the last process 
     else if (j == 3) { 
      int value; 
      read(pipe3[0], &value, sizeof(int)); 
      char buf[4] = {0}; 
      memset(buf, 0, sizeof(buf)); 
      snprintf(buf, sizeof(value), "%d ", value); 
      write(1, buf, strlen(buf)); 
     } 
     break; 
    } 
} 
close(pipe1[0]); 
close(pipe2[0]); 
close(pipe3[0]); 
sleep(1); 

int k; 

for (k = 0; k < 4; k++) { 
    wait(0); 
} 

對於這種情況,我需要做些什麼,只是爲了得到一個(和適當的)輸出?

+0

您需要buf [5]我認爲,假設int在您的機器中長度爲4個字節。 – MayurK

回答

1

當您的某個子進程在您提供的代碼中執行break語句時,您會如何看待?提示:它不會退出。

此外,我懷疑你的管道可以像這樣工作。您可以在之前關閉其中兩個(其中兩個的其中一個)的寫入結尾。那些孩子不會神奇地重新開放,所以他們的整個管子都沒用。

+0

對不起,我編輯的代碼...我關閉(pipe3 [1])..所以我不應該關閉管道之前切換大小寫和每一個if語句我需要在末尾_exit(0)? – Luki

+0

@Luki,在分叉所有需要使用管端的孩子之前,父母不應該關閉其任何管端的副本。避免所有閉包,直到循環完成後纔是一種簡單的方法。您確實需要確保每個孩子在完成其預定工作時退出;將'_exit(0)'放在每個'if'塊中將是實現該目的的一種方式。 –

+0

我已經解決了:)謝謝你一個非常明確的答案。 – Luki