FIFO

FIFO

Название каналов FIFO происходит от выражения First In First Out (первый вошел — первый вышел). FIFO очень похожи на каналы, поскольку являются однонаправленным средством передачи данных, причем чтение данных происходит в порядке их записи. Однако в отличие от программных каналов, FIFO имеют имена, которые позволяют независимым процессам получить к этим объектам доступ. Поэтому иногда FIFO также называют именованными каналами. FIFO являются средством UNIX System V и не используются в BSD. Впервые FIFO были представлены в System III, однако они до сих пор не документированы и поэтому мало используются.

FIFO является отдельным типом файла в файловой системе UNIX (ls -l покажет символ p в первой позиции, см. раздел "Файлы и файловая система UNIX" главы 1). Для создания FIFO используется системный вызов mknod(2):

int mknod(char *pathname, int mode, int dev);

где pathname — имя файла в файловой системе (имя FIFO),

mode — флаги владения, прав доступа и т.д. (см. поле mode файла),

dev — при создании FIFO игнорируется.

FIFO может быть создан и из командной строки shell:

$ mknod name p

После создания FIFO может быть открыт на запись и чтение, причем запись и чтение могут происходить в разных независимых процессах.

Каналы FIFO и обычные каналы работают по следующим правилам:

1. При чтении меньшего числа байтов, чем находится в канале или FIFO, возвращается требуемое число байтов, остаток сохраняется для последующих чтений.

2. При чтении большего числа байтов, чем находится в канале или FIFO, возвращается доступное число байтов. Процесс, читающий из канала, должен соответствующим образом обработать ситуацию, когда прочитано меньше, чем заказано.

3. Если канал пуст и ни один процесс не открыл его на запись, при чтении из канала будет получено 0 байтов. Если один или более процессов открыли канал для записи, вызов read(2) будет заблокирован до появления данных (если для канала или FIFO не установлен флаг отсутствия блокирования O_NDELAY).

4. Запись числа байтов, меньшего емкости канала или FIFO, гарантированно атомарно. Это означает, что в случае, когда несколько процессов одновременно записывают в канал, порции данных от этих процессов не перемешиваются.

5. При записи большего числа байтов, чем это позволяет канал или FIFO, вызов write(2) блокируется до освобождения требуемого места. При этом атомарность операции не гарантируется. Если процесс пытается записать данные в канал, не открытый ни одним процессом на чтение, процессу генерируется сигнал SIGPIPE, а вызов write(2) возвращает 0 с установкой ошибки (errno=ERRPIPE) (если процесс не установил обработки сигнала SIGPIPE, производится обработка по умолчанию — процесс завершается).

В качестве примера приведем простейший пример приложения клиент- сервер, использующего FIFO для обмена данными. Следуя традиции, клиент посылает серверу сообщение "Здравствуй, Мир!", а сервер выводит это сообщение на терминал.

Сервер:

#include <sys/types.h>

#include <sys/stat.h>

#define FIFO "fifo.1"

#define MAXBUFF 80

main() {

 int readfd, n;

 char buff[MAXBUFF]; /* буфер для чтения данных из FIFO */

 /* Создадим специальный файл FIFO с открытыми для всех

    правами доступа на чтение и запись */

 if (mknod(FIFO, S_IFIFO | 0666, 0) < 0) {

  printf("Невозможно создать FIFO ");

  exit(1);

 }

 /* Получим доступ к FIFO */

 if ((readfd = open(FIFO, O_RDONLY)) < 0) {

  printf("Невозможно открыть FIFO ");

  exit(1);

 }

 /* Прочитаем сообщение ("Здравствуй, Мир!") и выведем его

    на экран */

 while ((n = read(readfd, buff, MAXBUFF)) > 0)

  if {write(1, buff, n) != n) {

   printf("Ошибка вывода ");

   exit(1);

  }

 /* Закроем FIFO, удаление FIFO - дело клиента */

 close(readfd);

 exit(0);

}

Клиент:

#include <sys/types.h>

#include <sys/stat.h>

/* Соглашение об имени FIFO */

#define FIFO "fifo.1"

main() {

 int writefd, n;

 /* Получим доступ к FIFO */

 if ((writefd = open(FIFO, O_WRONLY)) < 0) {

  printf("Невозможно открыть FIFO ");

  exit(1);

 }

 /* Передадим сообщение серверу FIFO */

 if (write(writefd, "Здравствуй, Мир! ", 18) != 18) {

  printf("Ошибка записи ");

  exit(1);

 }

 /* Закроем FIFO */

 close(writefd);

 /* Удалим FIFO */

 if (unlink(FIFO) < 0) {

  printf("Невозможно удалить FIFO ");

  exit(1);

 }

 exit(0);

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

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

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

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


Атомарность записи в FIFO

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Атомарность записи в FIFO Наша простейшая пара клиент-сервер позволяет наглядно показать важность наличия свойства атомарности записи в пpoгрaммныe каналы и FIFO. Предположим, что два клиента посылают серверу запрос приблизительно в один и тот же момент. Первый клиент


4.11. Ограничения программных каналов и FIFO

Из книги Linux программирование в примерах автора Роббинс Арнольд

4.11. Ограничения программных каналов и FIFO На программные каналы и каналы FIFO системой накладываются всего два ограничения:? OPEN_MAX — максимальное количество дескрипторов, которые могут быть одновременно открыты некоторым процессом (Posix устанавливает для этой величины


10.14. Реализация с использованием FIFO

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

10.14. Реализация с использованием FIFO Займемся реализацией именованных семафоров Posix с помощью каналов FIFO. Именованный семафор реализуется как канал FIFO с конкретным именем. Неотрицательное количество байтов в канале соответствует текущему значению семафора. Функция sem_post


26.3. Каналы типа FIFO

Из книги Операционная система UNIX автора Робачевский Андрей М.

26.3. Каналы типа FIFO Канал FIFO — это канал, основанный на принципе очереди: «первым вошел, первым вышел». От обычного канала канал FIFO отличается следующим:? Канал FIFO сохраняется в файловой системе в виде файла, поэтому каналы FIFO называются именованными.? С именованным


9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO

Из книги автора

9.3. Базовое межпроцессное взаимодействие: каналы и очереди FIFO Межпроцессное взаимодействие (Interprocess communication — IPC) соответствует своему названию: это способ взаимодействия для двух отдельных процессов. Самым старым способом IPC на системах Unix является канал (pipe):


9.4.3.4. Неблокирующий ввод/вывод для каналов и FIFO

Из книги автора

9.4.3.4. Неблокирующий ввод/вывод для каналов и FIFO Ранее для описания способа работы каналов мы использовали сравнение с двумя людьми, моющими и вытирающими тарелки с использованием сушилки; когда сушилка заполняется, останавливается моющий, а когда она пустеет,


5.4.5. Каналы FIFO

Из книги автора

5.4.5. Каналы FIFO Файл FIFO (First-In, First-Out — первым пришел, первым обслужен) — это канал, у которого есть имя в файловой системе. Любой процесс может открыть и закрыть такой файл. Процессы, находящиеся на противоположных концах канала, не обязаны быть связанными друг с другом.


FIFO

Из книги автора

FIFO Название каналов FIFO происходит от выражения First In First Out (первый вошел — первый вышел). FIFO очень похожи на каналы, поскольку являются однонаправленным средством передачи данных, причем чтение данных происходит в порядке их записи. Однако в отличие от программных