2015-09-04 149 views
1

這是我的代碼。基本上,我有很多孩子,他們應該從ptList中計算出一定數量的點數,將相應的點數傳遞給父級,父級將這些點數加起來。不幸的是,對於我的printf,「addToTotal」變量沒有更新過第一個孩子,我的回答不正確。任何建議都會令人難以置信。通過來自多個孩子的管道寫入父進程

pid_t worker[ workers ]; 
for (int i = 0; i < workers; i++) { 
//printf("I am child %i\n", i); 
if ((worker[i] = fork()) < 0) { 
    fail("Can't create child"); 
} else if (worker[i] == 0) { 
    //Close the reading end of the pipe for each child 
    close(pfd[0]); 

    // Get each of the workers to compare points 
    for (int k = i; k < ptCount; k += workers) { 
     for (int j = k + 1; j < ptCount; j++) { 
     int dx = ptList[ k ].x - ptList[ j ].x; 
     int dy = ptList[ k ].y - ptList[ j ].y; 
     if (dx * dx + dy * dy <= dsq) 
      childTotal++; 
     } 
    } 
    printf("Child %i total: %i\n", i, childTotal); 
    lockf(pfd[ 1 ], F_LOCK, 0); 
    write(pfd[ 1 ], &childTotal, sizeof(childTotal)); 
    lockf(pfd[ 1 ], F_ULOCK, 0); 
    close(pfd[ 1 ]); 
    exit(0); 
    wait(NULL); 
} 
wait(NULL); 
close(pfd[ 1 ]); 
read(pfd[ 0 ], &addToTotal, sizeof(addToTotal)); 
printf("AddToTotal: %i\n", addToTotal); 
total += addToTotal; 
} 
+0

在循環的第一次迭代中,父級關閉管道的寫入側。在第二次迭代中,子級繼承了寫入側關閉的管道。 –

回答

0

在循環的第一次迭代中,父級關閉管道的寫入端。在第二次迭代中,子級繼承了寫入側關閉的管道。你不能關閉循環內的寫入端,所以你需要第二個循環來完成讀取操作。

1

的孩子獲得在其上寫側被關閉的管道,因爲該行你expliciltly關閉:

close(pfd[ 1 ]); 

,然後在接下來的迭代中再次嘗試寫入管道:

write(pfd[ 1 ], &childTotal, sizeof(childTotal)); 
相關問題