What is fifo in linux

What is fifo in linux

С помощью труб могут общаться только родственные друг другу процессы, полученные с помощью fork (). Именованные каналы FIFO позволяют обмениваться данными с абсолютно «чужим» процессом.

С точки зрения ядра ОС FIFO является одним из вариантов реализации трубы. Системный вызов mkfifo () предоставляет процессу именованную трубу в виде объекта файловой системы. Как и для любого другого объекта, необходимо предоставлять процессам права доступа в FIFO, чтобы определить, кто может писать, и кто может читать данные. Несколько процессов могут записывать или читать FIFO одновременно. Режим работы с FIFO — полудуплексный, т.е. процессы могут общаться в одном из направлений. Типичное применение FIFO — разработка приложений «клиент — сервер».

Синтаксис функции для создания FIFO следующий:

int mkfifo(const char *fifoname, mode_t mode); При возникновении ошибки функция возвращает -1, в противном случае 0. В качестве первого параметра указывается путь, где будет располагаться FIFO. Второй параметр определяет режим работы с FIFO. Пример использования приведен ниже:

int fd_fifo; /*дескриптор FIFO*/

char buffer[]=»Текстовая строка для fifo\n»;

/*Если файл с таким именем существует, удалим его*/

if((mkfifo(«/tmp/fifo0001.1», O_RDWR)) == -1)

fprintf(stderr, «Невозможно создать fifo\n»);

/*Открываем fifo для чтения и записи*/

if((fd_fifo=open(«/tmp/fifo0001.1», O_RDWR)) == — 1)

fprintf(stderr, «Невозможно открыть fifo\n»);

if(read(fd_fifo, &buf, sizeof(buf)) == -1)

fprintf(stderr, «Невозможно прочесть из FIFO\n»);

printf(«Прочитано из FIFO : %s\n»,buf);

Если в системе отсутствует функция mkfifo (), можно воспользоваться общей функцией для создания файла: int mknod(char *pathname, int mode, int dev);

Здесь pathname указывает обычное имя каталога и имя FIFO. Режим обозначается константой S_IFIFO из заголовочного файла . Здесь же определяются права доступа. Параметр dev не нужен. Пример вызова mknod :

if(mknod(«/tmp/fifo0001.1», S_IFIFO | S_IRUSR | S_IWUSR,

Флаг O_NONBLOCK может использоваться только при доступе для чтения. При попытке открыть FIFO с O_NONBLOCK для записи возникает ошибка открытия. Если FIFO закрыть для записи через close или fclose , это значит, что для чтения в FIFO помещается EOF.

Если несколько процессов пишут в один и тот же FIFO, необходимо обратить внимание на то, чтобы сразу не записывалось больше, чем PIPE_BUF байтов. Это необходимо, чтобы данные не смешивались друг с другом. Установить пределы записи можно следующей программой: #include

/*Создаем новый FIFO*/

if((mkfifo(«fifo0001», O_RDWR)) == -1)

fprintf(stderr, «Невозможно создать FIFO\n»);

printf(«Можно записать в FIFO сразу %ld байтов\n»,

printf(«Одновременно можно открыть %ld FIFO \n»,

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

В следующем примере организуется обработчик сигнала SIGPIPE , создается FIFO, процесс-потомок записывает данные в этот FIFO, а родитель читает их оттуда. Пример иллюстрирует простое приложение типа «клиент — сервер»:

static volatile sig_atomic_t sflag;

static sigset_t signal_new, signal_old, signal_leer;

static void sigfunc(int sig_nr)

fprintf(stderr, «SIGPIPE вызывает завершение

if(signal(SIGPIPE, sigfunc) == SIG_ERR)

fprintf(stderr, «Невозможно получить сигнал

/*Удаляем все сигналы из множества сигналов*/

/*Устанавливаем signal_new и сохраняем его*/

/* теперь маской сигналов будет signal_old*/

&signal_old) 0) /*Родитель читает из FIFO*/

if (( r_fifo=open(«/tmp/fifo0001.1», O_RDONLY))

Next: Блокировка файлов Up: Трубы (pipes) Previous: Функция popen() Contents 2004-06-22

Источник

What are Named Pipes or FIFO in Linux/Unix systems?

Pipes were meant for communication between related processes. We Cannot use pipes for unrelated process communication. Then to achieve unrelated processes communication, the simple answer is Named Pipes. Even though this works for related processes, it gives no meaning to use the named pipes for related process communication.

Unlike pipe, we can use single named pipe that can be used for two-way communication (communication between the server and the client, plus the client and the server at the same time) as Named Pipe supports bi-directional communication.

Another name for named pipe is FIFO (First-In-First-Out). Let us see the system call (mknod()) to create a named pipe, which is a kind of a special file.

This system call would create a special file or file system node such as ordinary file, device file, or FIFO. The arguments to the system call are pathname, mode and dev. The pathname along with the attributes of mode and device information. The pathname is relative, if the directory is not specified it would be created in the current directory. The mode specified is the mode of file which specifies the file type such as the type of file and the file mode as mentioned in the following tables. The dev field is to specify device information such as major and minor device numbers.

Читайте также:  Ads on windows application
File Type Description File Type Description
S_IFBLK block special S_IFREG Regular file
S_IFCHR character special S_IFDIR Directory
S_IFIFO FIFO special S_IFLNK Symbolic Link
File Mode Description File Mode Description
S_IRWXU Read, write, execute/search by owner S_IWGRP Write permission, group
S_IRUSR Read permission,owler S_IXGRP Execute/search permission, group
S_IWUSR Write permission, owner S_IRWXO Execute/search permission, group
S_IXUSR Execute/search permission, owner S_IROTH Read permission, others
S_IRWXG Read, write, execute/search by group S_IWOTH Write permission, others
S_IRGRP Read permission, group S_IXOTH Execute/search permission, others

File mode can also be represented in octal notation such as 0XYZ, where X represents owner, Y represents group, and Z represents others. The value of X, Y or Z can range from 0 to 7. The values for read, write and execute are 4, 2, 1 respectively. If needed in combination of read, write and execute, then add the values accordingly.

Say, if, 0640, then this means read and write (4 + 2 = 6) for owner, read (4) for group and no permissions (0) for others.

This call would return zero on success and -1 in case of failure. To know the cause of failure, check with errno variable or perror() function.

This library function creates a FIFO special file, which is used for named pipe. The arguments to this function is file name and mode. The file name can be either absolute path or relative path. If full path name (or absolute path) is not given, the file would be created in the current folder of the executing process. The file mode information is as described in mknod() system call.

This call would return zero on success and -1 in case of failure. To know the cause of failure, check with errno variable or perror() function.

Let us consider a program of running the server on one terminal and running the client on another terminal. The program would only perform one-way communication. The client accepts the user input and sends the message to the server, the server prints the message on the output. The process is continued until the user enters the string “end”.

Let us understand this with an example −

Step 1 − Create two processes, one is fifoserver and another one is fifoclient.

Step 2 − Server process performs the following −

Creates a named pipe (using system call mknod()) with name “MYFIFO”, if not created.

Opens the named pipe for read only purposes.

Here, created FIFO with permissions of read and write for Owner. Read for Group and no permissions for Others.

Waits infinitely for message from the Client.

If the message received from the client is not “end”, prints the message. If the message is “end”, closes the fifo and ends the process.

Step 3 − Client process performs the following −

1) Opens the named pipe for write only purposes.

2) Accepts the string from the user.

3) Checks, if the user enters “end” or other than “end”. Either way, it sends a message to the server. However, if the string is “end”, this closes the FIFO and also ends the process.

4) Repeats infinitely until the user enters string “end”.

Two-way Communication Using Named Pipes

The communication between pipes are meant to be unidirectional. Pipes were restricted to one-way communication in general and need at least two pipes for two-way communication. Pipes are meant for inter-related processes only. Pipes can’t be used for unrelated processes communication, say, if we want to execute one process from one terminal and another process from another terminal, it is not possible with pipes. Named pipe is meant for communication between two or more unrelated processes and can also have bi-directional communication.

Already, we have seen the one-directional communication between named pipes, i.e., the messages from the client to the server. Now, let us take a look at the bi-directional communication i.e., the client sending message to the server and the server receiving the message and sending back another message to the client using the same named pipe.

Following is an example −

Step 1 − Create two processes, one is fifoserver_twoway and another one is fifoclient_twoway.

Step 2 − Server process performs the following −

Creates a named pipe (using library function mkfifo()) with name “fifo_twoway” in /tmp directory, if not created.

Opens the named pipe for read and write purposes.

Here, created FIFO with permissions of read and write for Owner. Read for Group and no permissions for Others.

Waits infinitely for a message from the client.

If the message received from the client is not “end”, prints the message and reverses the string. The reversed string is sent back to the client. If the message is “end”, closes the fifo and ends the process.

Step 3 − Client process performs the following −

Opens the named pipe for read and write purposes.

Accepts string from the user.

Checks, if the user enters “end” or other than “end”. Either way, it sends a message to the server. However, if the string is “end”, this closes the FIFO and also ends the process.

If the message is sent as not “end”, it waits for the message (reversed string) from the client and prints the reversed string.

Repeats infinitely until the user enters the string “end”.

Источник

Русские Блоги

linux process communication — известная труба FIFO

введение:Безымянная трубаОсновное ограничение заключается в том, что у него нет имени, а объем общения ограничен процессами, которые связаны кровью. Хорошо известный канал существует в файловой системе как файл FIFO. Таким образом, даже процесс, не связанный с процессом создания FIFO, может обмениваться данными через FIFO, пока он обращается к пути. Эта заметка включает введение в FIFO, примеры кода и реализацию ядра.

1. Введение в FIFO

1.1. «Знаменитый» трубопровод:

FIFO относится к принципу «первым пришел — первым ушел» (first in, first out), FIFO в Unix похож на канал. Это односторонний (полудуплексный поток данных). В отличие от конвейеров, каждый FIFO имеет связанное с ним имя пути, что позволяет несвязанным процессам обращаться к одному и тому же FIFO для связи. FIFO также называется именованным каналом.

1.2. Создать:

FIFO создается функцией mkfifo (), прототип функции:

int mkfifo(const char *pathname, mode_t mode)

  • const char *pathname:Это общее имя пути unix, это имя FIFO.
  • ** mode: ** параметр режима указывает бит разрешения FIFO, это S_IRUSER (чтение владельца), S_IWUSR (запись владельца), S_IRGRP (чтение члена группы), S_IWGRP (запись члена группы), S_IROTH (чтение другого пользователя), S_IWOTH (написано другими пользователями) — это побитовое ИЛИ, составленное из этих шести констант.

Функция mkfifo неявно указала O_CREAT | O_EXCL, то есть она либо создает новый FIFO, либо возвращает ошибку EEXIST (FIFO с указанным именем уже существует). Если вы не хотите создавать новый FIFO, вызовите open вместо mkfifo. Чтобы открыть существующий FIFO или создать новый FIFO, вы должны сначала вызвать mkfifo, а затем проверить, возвращает ли он ошибку EEXIST. Если возвращается, вызовите вместо этого open.

1.3. Правила открытия FIFO:

1), еслиТекущая открытая операция предназначена для чтенияПри открытии FIFO, если уже естьСоответствующий процесс — записьКогда FIFO открыт, текущая операция открытия будет успешно возвращена; в противном случае она может заблокироваться до тех пор, пока соответствующий процесс не откроет FIFO для записи (текущая операция открытия установила флаг блокировки); или он успешно возвращается (текущая операция открытия не устанавливает флаг блокировки) .
2), еслиТекущая открытая операция предназначена для записиПри открытии FIFO, если уже естьСоответствующий процесс читаетсяКогда FIFO открыт, текущая операция открытия будет успешно завершена; в противном случае он может заблокироваться, пока соответствующий процесс не откроет FIFO для чтения (текущая операция открытия установила флаг блокировки); или он вернет ошибку ENXIO (текущая операция открытия не устанавливает флаг блокировки) ).

Короче говоря, как только установлен флаг блокировки и установлен вызов mkfifo, оба конца конвейера должны быть открыты для чтения и записи.Если какая-либо сторона не открыта, она будет заблокирована при вызове open. Запись в каналы или FIFO всегда добавляет данные в конец, чтение в них всегда возвращает данные с начала и вызывает lseek в каналах или FIFO, чтобы вернуть ошибку ESPIPE.

1.4. Чтение данных в FIFO:

Если процесс блокирует открытие FIFO для чтения данных из FIFO, то операция чтения в процессе называется операцией чтения с установленным флагом блокировки. И есть процесс записи, чтобы открыть FIFO, и в текущем FIFO нет данных,То есть в это время установлены оба конца конвейера, но конец записи еще не записал данные.

1) Для операции чтения с установленным флагом блокировки она всегда будет заблокирована (то есть блок активен и ожидает данных. Он не потребляет ресурсы ЦП, и этот метод синхронизации процессов очень эффективен для ЦП. )
2). Для операций чтения без установленного флага блокировки возвращается -1, текущее значение errno — EAGAIN, напомните, чтобы повторить попытку позже.

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

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

Следует отметить следующее:Считать открытый флаг блокировкиВлияет только на первую операцию чтения этого процессаЕсли в этом процессе есть несколько последовательностей операций чтения, после пробуждения первой операции чтения и завершения операции чтения другие выполняемые операции чтения больше не будут блокироваться, даже если в FIFO нет данных при выполнении операции чтения. Точно так же в это время операция чтения возвращает 0.

1.5. Записать данные в FIFO:

Если процесс блокирует открытие FIFO для записи данных в FIFO, тогда операция записи в процессе называется операцией записи с установленным флагом блокировки. Для операций с установленными флагами блокировки записи:

1), когдаКогда объем записываемых данных не превышает PIPE_BUFLinux гарантирует атомарность написания. Если свободного буфера конвейера недостаточно для хранения количества байтов, которые должны быть записаны в это время, он переходит в спящий режим, и операция однократной записи начинается, когда буфер может удерживать количество байтов для записи.
2), когда захотитеКогда объем записанных данных больше PIPE_BUFLinux больше не гарантирует атомарность записи. Как только в буфере FIFO появится свободная область, процесс записи попытается записать данные в канал, и операция записи вернется после записи всех запрошенных данных.

Для операций записи без флага блокировки:

1), при необходимостиКогда объем записываемых данных превышает PIPE_BUF, Linux больше не будет гарантировать атомарность записи.. После заполнения всех свободных буферов FIFO операция записи возвращается.
2)、Когда объем записываемых данных меньше PIPE_BUF, Linux гарантирует атомарность записи.. Если текущий свободный буфер FIFO может вместить количество байтов, запрошенных для записи, он будет успешно возвращен после записи; если текущий свободный буфер FIFO не может вместить количество байтов, запрошенных для записи, будет возвращена ошибка EAGAIN, чтобы напомнить вам о записи позже;

2. Пример кода:

2.1. Связь между несвязанным сервером и клиентом:

Основной процесс:

1). Сервер создает известные каналы FIFO1 и FIFO2 и устанавливает FIFO1 только для чтения, FIFO2 для записи
2). Клиент открывает известные каналы FIFO1 и FIFO2 и устанавливает для FIFO1 только запись и FIFO2 только для чтения.
3), отправка и получение данных
4), внимательно читать и писать, отключать

Программный код на стороне сервера:

Код клиентской программы:

Явление 1: Когда клиент не подключен, сервер находится в состоянии блокировки:

Феномен 2: Когда клиент подключен, состояние выполнения:

3. Реализация в ядре именованных каналов FIFO:

Поскольку конвейер может использоваться только в двух связанных друг с другом процессах, например в родительско-дочернем процессе; если вы хотите использовать каналы для связи между двумя несвязанными процессами, тогда конвейер бесполезен. Как позволить двум несвязанным процессам найти индексный дескриптор с атрибутом pipe? Естественно подумайте об использовании файлов на диске.
Когда два процесса в Linux обращаются к одному и тому же файлу, хотя их соответствующие файлы различаются, все они указывают на один и тот же узел Inode, поэтому канал и файл на диске объединяются для получения имени трубопровод.

Можно видеть, что две функции операций идентичны, что указывает на то, что операции чтения и записи в FIFO также читаются и записываются в буфер канала, поэтому файл, созданный с помощью fifo, позволяет процессу чтения и записи только найти один и тот же индексный дескриптор, а затем использовать один и тот же буфер канала.

Справочные материалы:
1. Сетевое программирование в Unix, том II
2、Linux знаменитый канал FIFO)
3、Поговорим о реализации pipe из кода ядра

Исправления и предложения
Электронная почта: [email protected]

Интеллектуальная рекомендация

Пошаговая загрузка файла Spring MVC-09 (на основе файла загрузки клиента Servlet3.0 + Html5)

пример тестовое задание Исходный код Несмотря на загрузку файлов в Servlet3.0 +, мы можем очень легко программировать на стороне сервера, но пользовательский интерфейс не очень дружелюбен. Одна HTML-ф.

Создайте многоканальное окно в приложениях Win32

Создайте многоканальное окно в приложениях Win32, создайте несколько оконных объектов одного и того же класса Windows, а окна объектов разных классов окон. .

Путь к рефакторингу IOS-APP (3) Введение в модульное тестирование

IOS-APP реконструкция дороги (1) структура сетевых запросов IOS-APP реконструкция дороги (два) Модельный дизайн При рефакторинге нам нужна форма, позволяющая вносить смелые изменения, обеспечивая при .

Tree——No.617 Merge Two Binary Trees

Problem: Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new bin.

Источник

Читайте также:  What do you need to do before upgrading to windows 10
Оцените статью