Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
531 из 715
Ядро может запустить другие процессы, которые вели запись на терминал до того, как первый процесс был повторно запущен. По этой причине, ядро не гарантирует, что содержимое буфера данных, выводимое в результате вызова системной функции write, появится на экране терминала в непрерывном виде.
char form[]="это пример вывода строки из порожденного процесса";
main() {
char output[128];
int i;
for (i = 0; i ‹ 18; i++) {
switch (fork()) {
case -1: /* ошибка — превышено максимальное число процессов */
exit();
default: /* родительский процесс */
break;
case 0: /* порожденный процесс */
/* формат вывода строки в переменной output */
sprintf(output, "%%d\n%s%d\n", form, i, form, i);
for (;;) write(1, output, sizeof(output));
}
}
}
Рисунок 10.14. Передача данных через стандартный вывод
Рассмотрим программу, приведенную на Рисунке 10.14. Родительский процесс создает до 18 порожденных процессов; каждый из порожденных процессов записывает строку (с помощью библиотечной функции sprintf) в массив output, который включает сообщение и значение счетчика i в момент выполнения функции fork, и затем входит в цикл пошаговой переписи строки в файл стандартного вывода. Если стандартным выводом является терминал, терминальный драйвер регулирует поток поступающих данных. Выводимая строка имеет более 64 символов в длину, то есть слишком велика для того, чтобы поместиться в символьном блоке (длиной 64 байта) в версии V системы.
|< Пред. 529 530 531 532 533 След. >|