[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Именованные каналы - Введение

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

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

Пример иллюстрирует  использование именованных  каналов  из  командной
строки интерпретатора  shell на двух различных терминалах. Представьте
себе такую  ситуацию:  вы  имеете  терминальный  класс,  в  котором  в
качестве одного  из терминалов  используется телетайп. Первый человек,
вошедший в  класс, входит в систему и исполняет команды, приведенные в
верхней  части   иллюстрации.  Первая   команда  создает   в   текущей
именованный канал  NP. Команда  /etc/mknod использует  системный вызов
mknod для  создания  именованного  канала.  chmod ug+w NP  дает  права
записи в  этот файл  любому процессу  того же  пользователя или любого
пользователя из  той же группы. line < NP читает одну строку из своего
перенаправленного стандартного  ввода, т.е. из именованного канала NP,
и выводит  прочитанное на  свой стандартный  вывод. Если  никто еще не
открыл именованный  канал на запись, line(1) будет спать, ожидая ввода
от других процессов.

Теперь на  одном из  экранных терминалов  командой  cat(1)  содержимое
целого файла  копируется в  именованный канал.  line(1) на  печатающем
терминале просыпается,  как только  cat(1) открывает именованный канал
на запись;  затем она  читает первую строку из канала и печатает ее на
свой стандартный вывод.

Когда все  читающие и  пишущие процессы завершаются, все непрочитанные
данные исчезают  и блоки  памяти, используемые каналом, освобождаются.
Однако, запись  в директории,  показывающая права  доступа  к  каналу,
сохраняется до тех пор, пока не будет удалена.

Это можно  показать, если вызвать команды line и ls -l из порожденного
интерпретатора shell,  который получает  ввод из  NP.  Команда  ls  не
использует стандартный  ввод; ее  присутствие нужно  только для  того,
чтобы показать,  что 4  строки, содержащие   108  символов, остаются в
канале до  тех пор,  пока читающий  процесс активен.  Когда подпроцесс
завершится, в именованном канале не будет ни одного байта.

Содержимое файла data таково:

$ cat data
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
                    ИМЕНОВАННЫЕ КАНАЛЫ - ВВЕДЕНИЕ


                       на печатающем терминале:


$ /etc/mknod NP p
$ chmod ug+w NP
$
$ #  NOTE "line < NP"  reads first line of NP
$ (line; ls -l NP) <NP
ABCDEFGHIJKLMNOPQRSTUVWXYZ
prw-rw----   1 tmm     unixc   108 Sep 19 13:55 NP
$
$ ls -l NP
prw-rw----   1 tmm     unixc     0 Sep 19 13:56 NP




                        на экранном терминале:


$ ls -l NP
prw-rw----   1 tmm     unixc     0 Sep 19 13:54 NP
$ cat data >NP


+
Дополнительная информация  (на случай,  если не  все обучаемые  хорошо
знают shell):  если вы  хотите прочитать  все строки  из  именованного
канала, по  одной за  раз, команда  line(1)  должна  использоваться  в
цикле, а  ввод этого  цикла должен  быть перенаправлен из именованного
канала.