Как ожидать до всех дочерних процессов, названных ветвлением () завершенный?

18
задан Cœur 30 April 2017 в 03:26
поделиться

5 ответов

Я переместил бы все после того, как строка "еще//порождает" вниз, вне для цикла. После цикла ветвлений сделайте другого для цикла с 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 выстраивает и возвращает индекс.

22
ответ дан 30 November 2019 в 07:00
поделиться

Самый простой метод должен сделать

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).

13
ответ дан 30 November 2019 в 07:00
поделиться

Звоните ожидают (или waitpid) в цикле, пока все дети не составляются.

В этом случае, все процессы синхронизируются так или иначе, но в целом ожидание предпочтено, когда больше работы может быть сделано (например, пул рабочего процесса), так как это возвратится когда первые доступные изменения состояния процесса.

4
ответ дан 30 November 2019 в 07:00
поделиться

Я верю эти , ожидают, системный вызов выполнит то, что Вы ищете.

3
ответ дан 30 November 2019 в 07:00
поделиться
for (int i = 0; i < pidCount; i++) {
    while (waitpid(pids[i], NULL, 0) > 0);
}

Это не будет ожидать в правильном порядке, но это остановится вскоре после того, как последний ребенок умирает.

0
ответ дан 30 November 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: