Как узнать, закончилась ли программа выполнением сигнала? - PullRequest
6 голосов
/ 22 декабря 2010

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

Одна из вещей, которую должен сделать монитор, - показать окончаниекод программы, которую он отслеживал, если она закончилась «естественными причинами», или код сигнала, ответственного за его завершение.

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

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 Ответ

5 голосов
/ 22 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...