Архитектура операционной системы UNIX


         

то есть если специально не


  • По умолчанию ( то есть если специально не оговорены никакие другие действия) процесс выходит из состояния останова, в которое он вошел с помощью функции wait, и запускает алгоритм issig для опознания типа поступившего сигнала. Алгоритм issig () рассматривает особый случай поступления сигнала типа "гибель потомка" и возвращает "ложь". Поэтому ядро не выполняет longjump из функции sleep, а возвращает управление функции wait. Оно перезапускает функцию wait, находит потомков, прекративших существование (по крайней мере, одного), освобождает место в таблице процессов, занимаемое этими потомками, и выходит из функции wait, возвращая управление процессу, вызвавшему ее.
  • Если процессы принимает сигналы данного типа, ядро делает все необходимые установки для запуска пользовательской функции обработки сигнала, как и в случае поступления сигнала любого другого типа.
  • Если процесс игнорирует сигналы данного типа, ядро перезапускает функцию wait, освобождает в таблице процессов место, занимаемое потомками, прекратившими существование, и исследует оставшихся потомков.


  • алгоритм wait входная информация: адрес переменной для хранения значения status, возвращаемого завершающимся процессом выходная информация: идентификатор потомка и код возврата функции exit { если (процесс, вызвавший функцию wait, не имеет потом- ков) возвратить (ошибку);

    для (;;) /* цикл с внутренним циклом */ { если (процесс, вызвавший функцию wait, имеет потом- ков, прекративших существование) { выбрать произвольного потомка; передать его родителю информацию об использова- нии потомком ресурсов центрального процессора; освободить в таблице процессов место, занимае- мое потомком; возвратить (идентификатор потомка, код возврата функции exit, вызванной потомком); } если (у процесса нет потомков) возвратить ошибку; приостановиться с приоритетом, допускающим прерыва- ния (до завершения потомка); } }
    Рисунок 7.16. Алгоритм функции wait

    Например, если пользователь запускает программу, приведенную на , с параметром и без параметра, он получит разные результаты. Сначала рассмотрим случай, когда пользователь запускает программу без параметра (единственный параметр - имя программы, то есть argc равно 1). Родительский процесс порождает 15 потомков, которые в конечном итоге завершают свое выполнение с кодом возврата i, номером процесса в порядке очередности создания. Ядро, исполняя функцию wait для родителя, находит потомка, прекратившего существование, и передает родителю его идентификатор и код возврата функции exit. При этом заранее не известно, какой из потомков будет обнаружен. Из текста программы, реализующей системную функцию exit, написанной на языке Си и включенной в библиотеку стандартных подпрограмм, видно, что программа запоминает код возврата функции exit в битах 8-15 поля ret_code и возвращает функции wait идентификатор процесса-потомка. Таким образом, в ret_code хранится значение, равное 256*i, где i - номер потомка, а в ret_val заносится значение идентификатора потомка.


    Содержание  Назад  Вперед