алгоритм 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 заносится значение идентификатора потомка.