Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
536 из 715
char input[256];
main() {
register int i;
for (i = 0; i ‹ 18; i++) {
switch (fork()) {
case -1: /* ошибка */
printf("операция fork не выполнена из-за ошибки\n");
exit();
default: /* родительский процесс */
break;
case 0: /* порожденный процесс */
for (;;) {
read(0, input, 256); /* чтение строки */
printf("%d чтение %s\n",i,input);
}
}
}
}
Рисунок 10.16. Конкуренция за данные, вводимые с терминала
На Рисунке 10.16 приведена программа, в которой родительский процесс порождает несколько процессов, осуществляющих чтение из файла стандартного ввода, конкурируя за получение данных, вводимых с терминала. Ввод с терминала обычно осуществляется слишком медленно для того, чтобы удовлетворить все процессы, ведущие чтение, поэтому процессы большую часть времени находятся в приостановленном состоянии в соответствии с алгоритмом terminal_read, ожидая ввода данных. Когда пользователь вводит строку данных, программа обработки прерываний от терминала возобновляет выполнение всех процессов, ведущих чтение; поскольку они были приостановлены с одним и тем же уровнем приоритета, они выбираются для запуска с одинаковым уровнем приоритета. Пользователь не в состоянии предугадать, какой из процессов выполняется и считывает строку данных; успешно созданный процесс печатает значение переменной i в момент его создания. Все другие процессы в конце концов будут запущены, но вполне возможно, что они не обнаружат введенной информации в списках для хранения вводных данных и их выполнение снова будет приостановлено.
|< Пред. 534 535 536 537 538 След. >|