Вот мой код для ситуации. В принципе, у меня есть несколько детей, и они должны подсчитывать определенное количество очков из 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;
}
На первой итерации цикла родительский элемент закрывает сторону записи трубы. На второй итерации ребенок наследует трубу, на которой закрыта запись. –