Я бы переместил все после строки "else // parent" вниз, вне цикла for. После цикла вилок выполните другой цикл for с waitpid, затем остановите часы и сделайте все остальное:
for (int i = 0; i < pidCount; ++i) {
int status;
while (-1 == waitpid(pids[i], &status, 0));
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
cerr << "Process " << i << " (pid " << pids[i] << ") failed" << endl;
exit(1);
}
}
gettimeofday (&second, &tzp); //stop time
Я предположил, что если дочерний процесс не может нормально завершиться со статусом 0, то он не завершил свою работу, и поэтому тест не смог получить действительные данные синхронизации. Очевидно, что если дочерние процессы предположительно будут уничтожены сигналами или выйдут из состояния возврата, отличного от 0, вам придется соответствующим образом изменить проверку ошибок.
Альтернатива с использованием wait:
while (true) {
int status;
pid_t done = wait(&status);
if (done == -1) {
if (errno == ECHILD) break; // no more child processes
} else {
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
cerr << "pid " << done << " failed" << endl;
exit(1);
}
}
}
Этот не говорит вам, какой процесс в последовательности завершился неудачно, но если вам не все равно, вы можете добавить код, чтобы найти его в массиве pids и вернуть индекс.