Именнованные каналы (FIFO)

Именованный канал ( FIFO ) - канал, который имеет имя в файловой системе. Любой процесс может открыть или закрыть именованный канал; процессы на любом конце канала не должны быть связаны друг с другом.

Именованный канал создается с помощью команды mkfifo. Первый параметр команды - путь, по которому создается именованный канал; второй параметр определяет владельца канала, группу, и права. Так как в канале должны осуществляться и чтение и запись, то должны быть права и на чтение и на запись. Если канал не может быть создан (например, если файл с этим именем уже существует), mkfifo возвращается -1. Для использования команды mkfifo необходимо подключить библиотеки <sys/types.h> и <sys/stat.h> .

Пример создания именованного канала /tmp/fifo :

	% mkfifo /tmp/fifo
	% ls -l /tmp/fifo
	prw-rw-rw- 1 samuel users 0 Jan 16 14:04 /tmp/fifo

Первый символ вывода команды ls p, показывает, что это именованный канал. Для чтения именованогоканала, используется команда cat < :

	% cat < /tmp/fifo

В другой оболочке команда cat > открывает именованный канал для записи:

	 % cat > /tmp/fifo

В появившемся окне можно набирать текст. Каждый раз при нажатии Enter, строка текста передается через именованный канал и появляется в первом окне. Для закрытия канала используется сочетание Ctrl+D. Команда rm используется для удаления именованного канала:

	% rm /tmp/fifo

Доступ к именованному каналу

Обращение к именованному каналу осуществляется также как и к обычному файлу. Чтобы общаться через именованный канал, одна программа должна открыть его для записи, а другая программа должна открыть его для чтения. Могут использоваться любые функции ввода-вывода ( open, write, read, close, fopen, fprintf, fscanf, fclose и др.).

Пример использования низкоуровневых процедур ввода-вывода для записи буфера данных в именованный канал:

	int fd = open (fifo_path, O_WRONLY);
	write (fd, data, data_length);
	close (fd);

Пример использования функций ввода-вывода библиотеки C для чтения строки из именованного канала:

	FILE* fifo = fopen (fifo_path, "r");
	fscanf (fifo, "%s", buffer);
	fclose (fifo);

Именнованный канал может иметь несколько процессов чтения и записи. Байты от каждого процесса записи атомарно записываются максимальным размером PIPE_BUF (4 КБ для Linux). Блоки от одновременно записывающих процессов могут быть чередованы. Подобные правила применяются и к процессам одновременного чтения.

Отличия от именованных каналов Windows

Каналы операционных систем Win32 подобны каналам Linux . Отличие заключается в том, что в Win32 именованные каналы функционируют также как и сокеты. Именнованные каналы Win32 могут соединять процессы на различных компьютерах, подключенных к сети. В Linux сокеты используются с той же целью. Однако Win32 позволяет множественные подключения процессов записи в именованный канал, не чередуя данные, поэтому каналы могут использоваться для двухстороннего взаимодействия.