Как узнать, завершила ли программа свое выполнение по сигналу?

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

одна из вещей, которые монитор должен сделать, это показать код завершения программы, которую он отслеживал, если он закончился "естественными причинами" или код сигнала, ответственного за его прекращение.

прямо сейчас я просто жду, когда ребенок закончит свое выполнение, а затем захватит свой код завершения. Это связанный код фрагмент:

pid_t id = -1;
switch (id = fork()) {
    // Error when forking:
    case -1:
        error(-1, "Something went wrong when forking.");
        exit(-1);
    // Code for the child process:
    case 0:
        // Just launch the program we're asked to:
        execvp(argv[2], &argv[2]);
        // If reached here it wasn't possible to launch the process:
        error(1, "Process could not be launched.");
        exit(1);
    // Code for the parent process:
    default:
        // Just wait for the child to finish its execution:
        wait(&return_value);
}

error(2) является функцией регистратора, просто для упрощения кода всякий раз, когда возникает ошибка.

в зависимости от того, какой процесс я должен показать разные высказывания:

Process ended: X

или

Process terminated with signal X.

где X будет кодом завершения или полученным сигналом. Как мы можем знать, если дочерний процесс завершился из-за сигнала?

1 ответов


С wait(2):

   WIFSIGNALED(status)
          returns true if the child process was terminated by a signal.
   WTERMSIG(status)
          returns  the  number  of the signal that caused the child process to terminate.

поэтому вам нужно проверить WIFSIGNALED(return_value) и если это правда, проверить WTERMSIG(return_value).