Книга: Основы программирования в Linux

Именованные каналы: FIFO

До сих пор вы могли передавать данные только между связанными программами, т.е. программами, которые стартовали из общего процесса-предка. Часто это очень неудобно, хотелось бы, чтобы и у несвязанных процессов была возможность обмениваться данными.

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

Вы можете создавать именованные каналы из командной строки и внутри программы. С давних времен программой создания их в командной строке была команда mknod:

$ mknod имя_файла p

Однако команды mknod нет в списке команд X/Open, поэтому она включена не во все UNIX-подобные системы. Предпочтительнее применять в командной строке

$ mkfifo имя_файла

Примечание

У некоторых более старых версий UNIX была только команда mknod. В стандарте X/Open issue 4 Version 2 есть вызов функции mknod, но не программа командной строки. ОС Linux, как всегда настроенная дружелюбно, предлагает оба варианта: mknod и mkfifo.

Внутри программы можете применять два разных вызова:

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *filename, mode_t mode);
int mknod(const char* filename, mode_t mode | S_IFIFO, (dev_t)0);

Помимо команды mknod вы можете использовать функцию mknod для создания файлов специальных типов. Единственный переносимый вариант применения этой функции, создающий именованный канал, — использование значения 0 типа dev_t и объединений с помощью операции or режима доступа к файлу и S_IFIFO. В примерах мы будем применять более простую функцию mkfifo.

Итак, выполните упражнение 13.9.

Упражнение 13.9. Создание именованного канала

Далее приведен исходный текст примера fifo1.c.

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main() {
 int res = mkfifo("/tmp/my_fifo", 0777);
 if (res == 0) printf ("FIFO createdn");
 exit(EXIT_SUCCESS);
}

Вы можете создать канал и заглянуть в него:

$ ./fifo1
FIFO created
$ ls -lF /tmp/my_fifo
prwxr-xr-x 1 rick users 0 2007-06-16 17:18 /tmp/my_fifo|

Обратите внимание на то, что первый символ вывода — р, обозначающий канал. Символ | в конце добавлен опцией -F команды ls и тоже обозначает канал.

Как это работает

Программа применяет функцию mkfifo для создания специального файла. Несмотря на то, что запрашиваете режим 0777, он заменяется пользовательской маской (umask), устанавливаемой (в данном случае 022) точно так же, как при создании обычного файла, поэтому у результирующего файла режим 755. Если ваша umask установлена иначе, например, ее значение 0002, вы увидите другие права доступа у созданного файла.

Удалить FIFO можно как традиционный файл с помощью команды rm или внутри программы посредством системного вызова unlink.

Оглавление книги


Генерация: 0.100. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз