Именованные каналы в Linux (в UNIX их иногда называют FIFO) могут использоваться как
средство взаимодействия между неродственными и даже удаленными процессами.
Такой канал имеет внешнее имя, которое включается в пространство имен файловой
системы. Поэтому именованный канал еще более похож на файл, чем неименованный.
В системе канал представляется специальным файлом и создается специальным
системным вызовом:
int mknod(char *name, int mode, int dev);
Этот системный вызов может использоваться также и для создания обычных файлов,
каталогов и других специальных файлов. Параметр name этого вызова
является указателем на символьную строку, содержащую имя канала (имя может
включать в себя также и путь). Параметр mode определяет тип
создаваемого файла и режим доступа к нему. Старшие 7 бит этого числа определяют
тип создаваемого файла (для именованного канала он может кодироваться
макроконстантой: S_IFIFO, младшие 9 бит определяют права доступа "rwx"
для владельца (старшая тройка), для группы (средняя тройка), для всех прочих
(младшая тройка). Так, например, для канала, который будет доступен только для
владельца, код параметра mode будет S_IFIFO|0x140, а
для канала, доступного для всех-всех-всех - S_IFIFO|0x1B6.
(Естественно, право "x " для канала не определяется.) Третий параметр при создании канала задается 0.
Далее при работе с именованным каналом используются файловые системные вызовы:
int open(int *name, int oflag);
int read(int pipe_fd, void *area, int cnt);
int write(int pipe_fd, void *area, int cnt);
int close(int pipe_fd);
Обратите внимание на то, что при открытии файла-канала могут быть заданы флаги
открытия, среди которых может быть и флаг O_NDELAY. Если
именованный канал открыт с этим флагом, то процесс, работающий с именованным
каналом, не переходит в ожидание в тех случаях, которые приводят к приостановке
процесса, работающего с неименованным каналом, - вместо этого системные вызовы
read и write
заканчиваются с признаком ошибки.
Именованный канал является постоянным объектом, он сохраняется даже после
завершения создавшего его процесса и при необходимости должен быть уничтожен
явно - при помощи системного вызова:
int unlink(char *name);
Пример выполнения приведен здесь.
Справочный материал
Избранные системные вызовы Linux/Unix. Краткое описание.
Cправочник библиотечных функция языка С: часть 1,
часть 2 (кодировка кириллица ibm866).