Как узнать, завершила ли программа свое выполнение по сигналу?
Я пишу монитор программы в качестве задания для курса операционных систем (очень простой, хотя, как введение в него).
одна из вещей, которые монитор должен сделать, это показать код завершения программы, которую он отслеживал, если он закончился "естественными причинами" или код сигнала, ответственного за его прекращение.
прямо сейчас я просто жду, когда ребенок закончит свое выполнение, а затем захватит свой код завершения. Это связанный код фрагмент:
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)
.