2015-09-04 10 views
1

Вот мой код для ситуации. В принципе, у меня есть несколько детей, и они должны подсчитывать определенное количество очков из ptList, передавать соответствующие точки родителям, а родительский их добавляет. К сожалению, с моими printfs переменная «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));