Системное программирование в UNIX средствами Free Pascal


Именованные каналы, или FIFO - часть 2


Некоторые атрибуты вновь созданного канала FIFO можно вывести при помощи команды ls:

$ ls -l channel

prw-rw-r- 1 ben usr 0 Aug 1 21:05 channel

Символ р

в первой колонке обозначает, что channel является файлом типа FIFO. Обратите внимание на права доступа к именованному каналу channel (чтение/запись для владельца и группы владельца, только чтение для всех остальных пользователей); владельца и группу владельца (ben, usr); размер (0 байт, то есть в настоящий момент канал пуст) и время создания.

При помощи стандартных команд

UNIX можно выполнять чтение из канала FIFO и запись в него, например:

$ cat < channel

Если выполнить эту команду сразу же после создания именованного канала channel, то она «зависнет». Это происходит из-за того, что процесс, открывающий канал FIFO на чтение, по умолчанию будет блокирован до тех пор, пока другой процесс не попытается открыть канал FIFO для записи. Аналогично процесс, пытающийся открыть канал FIFO для записи, будет блокирован до тех пор, пока другой процесс не попытается открыть его для чтения. Это благоразумный подход, так как он экономит системные ресурсы и облегчает координацию работы программы. Вследствие этого, при необходимости создания одновременно как записывающего, так и читающего процессов, потребуется запустить один из них в фоновом режиме (или с другого терминала, или псевдотерминала xterm графического интерфейса), например:

$ cat < channel &

102

$ ls -l > channel; wait

total 17

prw-rw-r- 1 ben usr 0     Aug 1   21:05   channel

-rw-rw-r- 1 ben usr 0     Aug 1   21:06   f

-rw-rw-r- 1 ben usr 937   Jul 27  22:30   fifos

-rw-rw-r- 1 ben usr 7152  Jul 27  22:11   pipes.cont

Проанализируем подробнее этот результат. Содержимое каталога вначале выводится при помощи команды ls, а затем записывается в канал FIFO. Ожидающая команда cat затем считывает данные из канала FIFO и выводит их на экран. После этого процесс, выполняющий команду cat, завершает работу. Это происходит из-за того, что канал FIFO больше не открыт для записи, чтение из него будет безуспешным, как и для обычного канала, что команда cat понимает как достижение конца файла. Команда же wait заставляет командный интерпретатор ждать завершения команды cat перед тем, как снова вывести приглашение командной строки.




- Начало -  - Назад -  - Вперед -



Книжный магазин