С точки зрения ядра ОС, именованный канал представляет собой файл, имеющий имя, которому соответствует запись в каталоге. Исходя из этого вызов такого канала осуществляется по имени, следовательно, использовать именованные каналы могут любые, даже не связанные между собой процессы. Поскольку именованные каналы — это файлы, то все функции, применимые к обычным файлам, работают и с именованными каналами.
Поскольку через канал осуществляется передача информации, причем одни процессы записывают туда информацию, а другие считывают ее, особую роль играет последовательность обращения к каналу. Невозможно считать информацию, пока она на поступила в канал. Поскольку количество записывающих процессов в один канал неограничено, то необходима синхронизация действий по записи и считыванию, которая обычно реализуется на основе других механизмов IPC.
Данные записываются и считываются из канала при помощи функции write{) и read{), но, в отличие от обычных файлов, для повышения эффективности в канале используются только блоки прямой адресации.
Для создания именованных каналов в некоторых системах имеется функция mkfifo(), создающая файлы особого типа. Из названия функции легко понять, что метод работы с таким каналом основан на технологии «первым пришел — первым вышел». Поскольку с именованным каналом могут работать несколько процессов, то необходимо определять права каждого на чтение/запись, используя функцию umask (), создающая битовую маску на все защитные аттрибуты файла: Вызов mkfifo{).
#include
#include
int mkfifo (const char 4fifoname, mode t mode);
где fifoname — имя создаваемого канала; mode — разрешения на работу с файлом задаваемые через маску mode & ~umask. При возникновении ошибки функция возвращает -1, в противном случае — 0. Если в системе нет функции mkssfoQ, то можно использовать функцию mknod () для создания файла:
int tnknod (char *pathname, int mode, int dev)-,
Параметр pathname обычно указывает каталог и имя файла. Права доступа определяются константой SIFIFO из хидерного файла . Третий параметр dev показывает тип устройства, па котором создается файл, — битили байт-ориентированное (обычно равен нулю). Фрагмент кода для создания именованного канала показан ниже:
if (mknod («/tmp/fifo0001.1 «, SJFIFO SJRUSR SJWUSR, 0) == - 1)
{// обработка ошибки открытия }