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