Именованный канал или FIFO с примером программы C
Введение
Именованные каналы, также называемые FIFO (первым пришел — первым вышел), представляют собой важные системы IPC в программных системах. Они предлагают быстрый и эффективный метод успешной передачи информации между процессами. Специализированные типы файлов, известные как именованные каналы, служат средством взаимодействия между несвязанными процедурами, которые работают как с идентичной структурой, так и с отдельными.
Именованные каналы по принципу «первым пришел — первым обслужен» (FIFO) гарантируют, что информация, записанная в строку одной процедурой, считывается из канала другим курсом в том же порядке. Поэтому они особенно выгодны, когда процессы должны взаимодействовать независимо друг от друга без совместного использования хранилища или прямого управления зависимостями.
В этой статье мы рассмотрим пример именованного канала или FIFO в программе на C, изучим варианты его использования, а также некоторые его преимущества и недостатки.
Пример именованного канала или FIFO
Ниже приведена программа на языке C, которая использует, например, именованные каналы.
В этом примере мы создаем именованный канал с помощью функции mkfifo с указанным путем (/tmp/myfifo). Затем мы создаем дочерний процесс, где дочерний процесс действует как записывающий, а родительский процесс выступает как читающий. Процесс записи открывает именованный канал для записи (O_WRONLY), записывает сообщение в канал с помощью функции записи, а затем закрывает канал. Процесс чтения открывает именованный канал для чтения (O_RDONLY), считывает сообщение из канала с помощью функции чтения, а затем закрывает канал. Родительский процесс ожидает завершения дочернего процесса, используя wait(NULL), а затем удаляет именованный канал, используя unlink.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/wait.h>
#define FIFO_PATH "/tmp/myfifo" // Path to the named pipe
void writer_process() {
int fd;
char message[] = "Hello, named pipe!";
// Open the named pipe for writing
fd = open(FIFO_PATH, O_WRONLY);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// Write the message to the named pipe
write(fd, message, strlen(message) + 1);
printf("Message sent: %s
", message);
// Close the named pipe
close(fd);
}
void reader_process() {
int fd;
char buffer[100];
// Open the named pipe for reading
fd = open(FIFO_PATH, O_RDONLY);
if (fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// Read the message from the named pipe
read(fd, buffer, sizeof(buffer));
printf("Message received: %s
", buffer);
// Close the named pipe
close(fd);
}
int main() {
pid_t pid;
// Create the named pipe
mkfifo(FIFO_PATH, 0666);
// Fork a child process
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// Child process (writer)
writer_process();
} else {
// Parent process (reader)
reader_process();
// Wait for the child process to finish
wait(NULL);
// Remove the named pipe
unlink(FIFO_PATH);
}
return 0;
}
Выход
Message sent: Hello, named pipe!
Message received: Hello, named pipe!
Примечание. В этом примере мы демонстрируем, как именованные каналы облегчают межпроцессное взаимодействие, позволяя передавать данные между независимыми процессами в порядке «первым поступил — первым обслужен» (FIFO). В реальном сценарии нам могут потребоваться соответствующие разрешения и обработка ошибок. Более того, путь к именованному каналу необходимо выбирать соответствующим образом, чтобы он соответствовал требованиям вашей системы.
Варианты использования именованного канала или FIFO
Давайте рассмотрим некоторые варианты использования именованных каналов или FIFO ниже.
Межпроцессное взаимодействие – Именованные каналы обычно используются для межпроцессного взаимодействия (IPC) между независимыми процессами. Они предоставляют процессам простой и эффективный способ обмена данными без совместного использования памяти и прямых зависимостей. Именованные каналы обеспечивают связь между процессами, работающими на одном компьютере или даже в разных системах, когда у них есть доступ к общей файловой системе.
Связь клиент-сервер . Именованные каналы часто используются в архитектурах клиент-сервер для установления каналов связи между клиентами и серверами. Сервер создает именованный канал и прослушивает запросы клиентов, а клиенты могут подключиться к серверу, открыв именованный канал. Это обеспечивает бесперебойную связь и обмен данными между клиентами и сервером.
Сценарии оболочки . Именованные каналы можно использовать в сценариях оболочки для подключения различных команд или процессов. Используя именованные каналы, выходные данные одной команды можно передать в другую команду в качестве входных данных, что позволяет объединить несколько команд в цепочку. Это обеспечивает гибкость сценариев и обеспечивает эффективный поток данных между различными компонентами.
Потоковая передача и ведение журнала данных . Именованные каналы полезны для потоковой передачи данных или файлов журналов между процессами. Например, процесс, генерирующий информацию журнала, может записывать журналы в именованный канал, а другой процесс может читать из канала и выполнять дальнейшую обработку или хранение данных журнала. Это позволяет в режиме реального времени обрабатывать и анализировать информацию журнала.
Распределенные вычисления – Именованные каналы могут облегчить взаимодействие между процессами в распределенных вычислительных средах. В сценариях, когда несколько процессов выполняются на разных машинах и им необходимо обмениваться данными, именованные каналы могут обеспечить надежный и эффективный механизм связи. Их можно использовать для передачи данных между распределенными компонентами, например, в средах распределенной обработки данных или приложениях параллельных вычислений.
Мониторинг и управление системой . Именованные каналы можно использовать в приложениях для мониторинга и управления системой. Например, процесс мониторинга может записывать системные метрики в именованный канал, а другие процессы или системы могут считывать данные из канала для сбора и анализа метрик. Это обеспечивает эффективный мониторинг и контроль системных ресурсов и производительности.
Преимущества именованного канала или FIFO
Следующие преимущества именованных каналов (FIFO) для межпроцессного взаимодействия:
Простой и удобный в использовании . Именованные каналы предлагают простой и несложный метод взаимодействия между процессами. Они работают по простой модели FIFO, когда информация, созданная одной процедурой, извлекается через другую процедуру в том же порядке.
-
Независимость процесса – операции с именованными каналами могут взаимодействовать друг с другом. Процедуры могут взаимодействовать друг с другом без предварительного понимания или доверия, если им предоставлены права на использование именованного канала.
Межпроцессное взаимодействие – когда именованный канал существует в общей файловой системе, к которой имеют доступ обе системы, он обеспечивает взаимодействие между процедурами, которые работают на одной и той же машине, а также между процедурами, которые работают на одной и той же машине. различные системы.
Эффективность . Именованные каналы — это продуктивный способ взаимодействия между процессами. Они могут эффективно обрабатывать огромные объемы данных и зависят от системы буферизации.
Недостатки именованного канала или FIFO
Следующие недостатки именованных каналов (FIFO) для межпроцессного взаимодействия:
Однонаправленная связь – Именованные каналы поддерживают односторонний обмен с точки зрения автора на члена аудитории или наоборот, поскольку они однонаправлены.
Ограниченная функциональность . Именованные каналы предлагают простой метод передачи информации и сравнительно просты. Расширенные функции, такие как ограничения связи, структуры данных и сложная сериализация данных, ими не поддерживаются.
Поведение при блокировке . Действия по чтению и записи в именованных каналах по умолчанию блокируются навсегда. Программа будет ограничена до тех пор, пока информация не станет доступной или пока не освободится время, если она попытается прочитать или записать в пустой канал или канал, который заполнен.
Ограниченная обработка ошибок – можно улучшить встроенные возможности именованных каналов. Кроме того, не существует интегрированной системы, которая могла бы справиться с такими ошибками или исправить их в случае возникновения ошибки связи, например, разрыва трубопровода или внезапного завершения операции.
Заключение
Крайне важно учитывать конкретные потребности, ограничения и компромиссы вашего приложения при выборе того, следует ли вам использовать именованные каналы для IPC. Решения Стратегии IPC, такие как розетки, время ожидания связи или общее хранилище, могут оказаться более подходящими в зависимости от уровня сложности и требуемых возможностей.
Именованные каналы во многих случаях являются ценным инструментом межпроцессного взаимодействия, предлагая немедленный и эффективный способ перехода между процедурами.