получение статуса выхода из дочернего процесса в c

Я не могу понять, что у меня не так с этим кодом. Это C на Linux-боксе.

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

Так что я делаю неправильно?

void onalarm(int signo) {
    int status[numberOfCores];
    printf("Recieved alarm signal\n");

    int cpu;
    for (cpu = 0; cpu < numberOfCores; cpu++) {
        kill(child_pid[cpu], SIGKILL);
    }

    for (cpu=0;cpu <numberOfCores;cpu++){
        waitpid(-1, &status[numberOfCores],0);
    }
    for (cpu=0;cpu < numberOfCores;cpu++){
        printf("pid = %i  %ith child killed with signal ",child_pid[cpu],cpu);

        printf("%i %s\n", WTERMSIG(status[cpu]), strsignal(WTERMSIG(status[cpu])));
    }
    exit(0);

person user3088814    schedule 07.05.2014    source источник
comment
Разве вы не должны делать waitpid в первом цикле for после kill?   -  person Mohit Jain    schedule 07.05.2014
comment
Что происходит, когда вы запускаете его?   -  person user3553031    schedule 07.05.2014
comment
Теперь он делает именно то, что я ожидаю. Он отправляет сигнал уничтожения, затем waitpid ожидает выхода всех из них и сохраняет статус выхода в массиве состояния. Если waitpid находится вне массива kill, он отправит kill всем дочерним процессам, а затем дождется их завершения, если он находится внутри первого цикла, он в конечном итоге сделает то же самое. Единственная проблема была бы, если бы дочерний элемент вышел до того, как он вышел из цикла уничтожения в цикл ожидания. Но это классное упражнение, и именно так нам было приказано его делать.   -  person user3088814    schedule 08.05.2014
comment
Позвольте мне объяснить немного лучше. Основная программа создает дочерний процесс для каждого ядра процессора, который просто запускает цикл, чтобы тратить время. Родительская программа устанавливает будильник на время (опция командной строки), затем запускает бесконечный цикл. Когда сигнал тревоги получен, родитель запускает этот код, чтобы отправить убийство каждому дочернему элементу, а затем распечатывает статус выхода для каждого дочернего элемента.   -  person user3088814    schedule 08.05.2014


Ответы (1)


Я понял, в чем моя проблема.

     for (cpu=0;cpu <numberOfCores;cpu++){
    waitpid(-1, &status[numberOfCores],0);

Должно быть.

     for (cpu=0;cpu <numberOfCores;cpu++){
    waitpid(-1, &status[cpu],0);

Получил это работает правильно знаю. Спасибо, что помог мне подумать.

person user3088814    schedule 07.05.2014