Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

• Когда место есть, будет записано столько данных, сколько возможно, так что в конечном счете все данные будут переписаны.

Подводя итог, если вы собираетесь использовать неблокирующий ввод/вывод, любой код, который использует

write
, должен быть способен обработать укороченную запись, когда успешно записан меньший объем данных, чем было затребовано. Устойчивый код в любом случае должен быть написан таким способом: даже в случае обычного файла диск может оказаться заполненным и
write
сможет записать лишь часть данных.

Более того, вы должны быть готовы обработать

EAGAIN
, понимая, что в этом случае неудача
write
не обязательно
означает фатальную ошибку. То же верно для кода, использующего для чтения неблокирующий ввод/вывод: признайте, что и здесь
EAGAIN
не является фатальным. (Однако, может стоит подсчитывать число таких отказов, оставив попытки, когда их слишком много.)

Неблокирующий ввод/вывод действительно усложняет вашу жизнь, в этом нет никакого сомнения. Но для многих приложений он является необходимостью, позволяющей выполнить задание. Снова рассмотрите спулер печати. Демон спулера не может позволить себе находиться в блокирующем

read
для файла FIFO, которому представлены входящие задания. Он должен иметь также возможность отслеживать запущенные задания и, возможно, периодически проверять состояние печатающих устройств (например, убедиться, что не заело бумагу).

9.4.3.5. Сводка fcntl

Сводка для системного вызова

fcntl
приведена в табл. 9.5.

Таблица 9.5. Сводка

fcntl

Значение
cmd
Значение
arg
Возвращает
F_DUPFD
Наименьший новый дескриптор Дублирует аргумент
fd
F_GETFD
Получает флаги дескриптора файла (close-on-exec)
F_SETFD
Новое значение флага Устанавливает флаги дескриптора файла (close-on-exec)
F_GETFL
Получает флаги основного файла
F_SETFL
Новое значение флага Устанавливает флаги основного файла

Флаги создания, статуса и прав доступа файла копируются, когда дескриптор файла дублируется. Флаг close-on-exec не копируется.

9.5. Пример: двусторонние каналы в

gawk

Двусторонний канал соединяет два процесса двунаправленным образом. Обычно, по крайней мере для одного из процессов, на канал с другим процессом настраиваются как стандартный ввод, так и стандартный вывод. Оболочка Корна (

ksh
) ввела двусторонние каналы на уровне языка, обозначив термином сопроцесса (coprocess):

команды и аргументы движка базы данных |& /* Запустить сопроцесс в фоновом режиме */

print -p "команда базы данных" /* Записать в сопроцесс */

read -p db_response /* Прочесть из сопроцесса */

Здесь движок базы данных представляет любую серверную программу, которая может управляться интерфейсной частью, в данном случае, сценарием

ksh
. У движка базы данных стандартный
ввод и стандартный вывод подсоединены к оболочке посредством двух отдельных односторонних каналов. [102] Это показано на рис. 9.7.

102

В одно и то же время есть только один сопроцесс по умолчанию (доступный посредством '

read -p
' и '
print -p
'). Сценарии оболочки могут использовать команду
exec
со специальной записью перенаправления для назначения дескрипторов файла сопроцесса определенным номерам. После этого можно запустить другой сопроцесс — Примеч. автора.

Рис. 9.7. Сопроцессы оболочки Корна

В обычном

awk
каналы к или от подпроцесса являются односторонними: нет способа послать данные в программу и прочесть посланные от нее в ответ данные — нужно использовать временный файл. GNU
awk
(
gawk
) заимствует обозначение '
|&
' от
ksh
для расширения языка
awk
:

print "команда" |& "движок базы данных" /* Запустить сопроцесс, записать в него */

"движок базы данных" |& getline db_response /* Прочесть из сопроцесса */

gawk
использует запись '
|&
' также для сокетов TCP/IP и порталов BSD, которые не рассматриваются в данной книге. Следующий код из
io.c
в дистрибутиве
gawk
3.1.3 является частью функции
two_way_open
, которая устанавливает простой сопроцесс: она создает два канала, порождает новый процесс и осуществляет все манипуляции с дескриптором файла. Мы опустили ряд не относящихся к делу частей кода (эта функция занимает больше места, чем следовало бы):

1561 static int

1562 two_way_open(const char *str, struct redirect *rp)

1563 {

...

1827 /* случай 3: двусторонний канал с порожденным процессом */

1828 {

1829 int ptoc[2], сtop[2];

1830 int pid;

1831 int save_errno;

1835

1836 if (pipe(ptoc) < 0)

1837 return FALSE; /* установлен errno, диагностика от вызывающего */

1838

1839 if (pipe(ctop) < 0) {

1840 save_errno = errno;

1841 close(ptoc[0]);

1842 close(ptoc[1]);

1843 errno = save_errno;

1844 return FALSE;

1845 }

Первым шагом является создание двух каналов,

ptoc
является каналом «от родителя к потомку», а
ctop
— «от потомка к родителю». Во время чтения держите в уме, что индекс 0 является читаемым концом, а 1 — записываемым.

Поделиться:
Популярные книги

Ведьма

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.54
рейтинг книги
Ведьма

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Большая игра

Ланцов Михаил Алексеевич
4. Иван Московский
Фантастика:
альтернативная история
5.00
рейтинг книги
Большая игра

Хозяйка Междуречья

Алеева Елена
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Хозяйка Междуречья

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Восьмое правило дворянина

Герда Александр
8. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восьмое правило дворянина

Идеальный мир для Лекаря 6

Сапфир Олег
6. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 6

Жена моего брата

Рам Янка
1. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Жена моего брата

Генерал Империи

Ланцов Михаил Алексеевич
4. Безумный Макс
Фантастика:
альтернативная история
5.62
рейтинг книги
Генерал Империи

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Светлая ведьма для Темного ректора

Дари Адриана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Светлая ведьма для Темного ректора

Хроники разрушителя миров. Книга 8

Ермоленков Алексей
8. Хроники разрушителя миров
Фантастика:
фэнтези
5.00
рейтинг книги
Хроники разрушителя миров. Книга 8