Поиск по сайту:

Именованный канал или 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, такие как розетки, время ожидания связи или общее хранилище, могут оказаться более подходящими в зависимости от уровня сложности и требуемых возможностей.

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

Статьи по данной тематике: