Я переместил бы все после того, как строка "еще//порождает" вниз, вне для цикла. После цикла ветвлений сделайте другого для цикла с 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 статусов возврата, то необходимо будет изменить проверку на ошибки соответственно.
альтернативное использование ожидайте:
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 выстраивает и возвращает индекс.
Самый простой метод должен сделать
while(wait() > 0) { /* no-op */ ; }
, Это не будет работать, если wait()
сбои по некоторым причинам кроме того, что нет никаких оставленных детей. Таким образом с некоторой проверкой ошибок, это становится
int status;
[...]
do {
status = wait();
if(status == -1 && errno != ECHILD) {
perror("Error during wait()");
abort();
}
} while (status > 0);
, См. также страницу руководства wait(2)
.
Звоните ожидают (или waitpid) в цикле, пока все дети не составляются.
В этом случае, все процессы синхронизируются так или иначе, но в целом ожидание предпочтено, когда больше работы может быть сделано (например, пул рабочего процесса), так как это возвратится когда первые доступные изменения состояния процесса.
Я верю эти , ожидают, системный вызов выполнит то, что Вы ищете.
for (int i = 0; i < pidCount; i++) {
while (waitpid(pids[i], NULL, 0) > 0);
}
Это не будет ожидать в правильном порядке, но это остановится вскоре после того, как последний ребенок умирает.