Прогон программы для иллюстрации обработки сигнала SIGCHLD

Для закрепления материала рассмотрим пример программы 12—13-5.C с асинхронным получением информации о статусе завершения порожденного процесса:

/* Программа с асинхронным получением информации о статусе двух завершившихся порожденных процессов */ ((include

#include

#include

#include

#include

/* Функция my_handler - обработчик сигнала SIGCHLD */ void my_handler(int nsig){ int status; pid_t pid;

/* Опрашиваем статус завершившегося процесса и одновременно узнаем его идентификатор */ if((pid = waitpid(-l, &status, 0)) < 0){

/* Если возникла ошибка - сообщаем о ней и продолжаем работу */

printf("Some error on waitpid errno = %d\n", errno);

} else {

/* Иначе анализируем статус завершившегося процесса */

if ((status & Oxff) == 0) {

/* Процесс завершился с явным или неявным вызовом функции exit() */

printf("Process %d was exited with status %d\n", pid, status » 8);

} else if ((status & OxffOO) == 0){

/* Процесс был завершен с помощью сигнала */

printf("Process %d killed by signal %d %s\n", pid, status &0x7f,(status & 0x80) ?

“with core file" : "without core file");

}

}

}

int main(void){ pid_t pid;

/* Устанавливаем обработчик для сигнала SIGCHLD */ (void) signal(SIGCHLD, my_handler);

/* Порождаем Child 1 */ if((pid = fork()) < 0){

printf("Can\'t fork child l\n"); exit(1) ;

} else if (pid == 0){

/* Child 1 - завершается с кодом 200 */ exit(200);

}

/* Продолжение процесса-родителя - порождаем Child 2 */ if((pid = fork()) < 0){

printf (11 Can\ ' t fork child 2\n"); exit(1) ;

} else if (pid == 0){

/* Child 2 - циклится, необходимо удалять с помощью сигнала ! */

while(1);

}

/* Продолжение процесса-родителя - уходим в цикл */ while(1); return 0;

}

В этой программе родитель порождает два процесса. Один из них завершается с кодом 200, а второй зацикливается. Перед порождением процессов родитель устанавливает обработчик прерывания для сигнала SIGCHLD, а после их порождения уходит в бесконечный цикл. В обработчике прерывания вызывается waitpid ( ) для любого порожденного процесса. Так как в обработчик мы попадаем, когда какой-либо из процессов завершился, системный вызов не блокируется, и мы можем получить информацию об идентификаторе завершившегося процесса и причине его завершения. Откомпилируйте программу и запустите ее на исполнение. Второй порожденный процесс завершайте с помощью команды kill с каким-либо номером сигнала. Родительский процесс также будет необходимо завершать командой kill.

<< | >>
Источник: В.Е. Карпов К.А. Коньков. Основы операционных систем. 2005

Еще по теме Прогон программы для иллюстрации обработки сигнала SIGCHLD:

  1. Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ
  2. СИГНАЛ
  3. Хислей Филипп. Генерация высококачественного кода для программ, написанных на СИ, 2010
  4. ПЕРЕИМЕНОВАНИЕ АКТУАЛЬНОГО СИГНАЛА
  5. 3. Использование программ для ЭВМ, баз данных и топологий ИМС третьими лицами
  6. § 6. Авторско-правовая охрана программ для ЭВМ, баз данных и топологий интегральных микросхем
  7. 1. Понятие программы для ЭВМ, базы данных и топологии интегральной микросхемы и основные правила их охраны
  8. 12.2.2. Правовое регулирование информационных отношений при производстве и распространении программ для ЭВМ и баз данных
  9. ИЛЛЮСТРАЦИЯ
  10. Иллюстрации