Іменовані канали в Linux (в UNIX їх іноді називають FIFO) можуть використовуватися як
засіб взаємодії між неродственными і навіть віддаленими процесами.
Такий канал має зовнішнє ім'я, яке включається до простір імен файлової
системи. Тому іменований канал ще більше схожий на файл, ніж неіменовані.
В системі канал є спеціальним файлом і створюється спеціальним
системним викликом:
int mknod(char *name, int mode, int dev);
Цей системний виклик може використовуватися також для створення звичайних файлів
каталогів та інших спеціальних файлів. Параметр цього виклику
є покажчиком на символьне рядок, що містить ім'я каналу (ім'я може
включати в себе також і шлях). Параметр 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. Короткий опис.
Довідник бібліотечних функція мови З: частина 1,
частина 2 (кодування кирилиця ibm866).