Читаем Linux: Полное руководство полностью

 char buf[126];


/* Создаем канал, если он еще не создан,

 права доступа 0666 */

 umask(0);

 mknod(FIFO, S_IFIFO|0666, 0);


 /* Ожидаем данные */

 while(1) {

  fp = fopen(FIFO, "r");

  fgets(buf, 128, fp);

  printf("Получена строка: %s\n", buf);

  fclose(fp);

 }

}

Теперь рассмотрим процесс-писатель, который будет записывать данные в FIFO-канал. Этот процесс не завершится до тех пор, пока процесс-читатель не прочитает их:

Листинг 26.4. Процесс-писатель writefifo.c

#include

#include

#define FIFO "FIFO"


void main(int argc, char *argv[]) {

 FILE *fp;

 if (argc != 2) {

  printf("USAGE: writefifo \n");

  exit(1);

 }

 fp = fopen(FIFO, "w");

 fputs(argv[1], fp);

 fclose(fp);

}

Запустите процесс-читатель, затем перейдите на другую консоль и запустите «писателя» с аргументом — строкой «info». На первой консоли вы увидите сообщение:

Получена строка: info

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

open(fd, O_NONBLOCK);

Ясное дело, что тогда нужно немного модифицировать исходный код: вызовы fclose(), fputs(), fgets() использовать уже нельзя, вместо них нужно использовать соответствующие вызовы close(), write(), read().

И последнее, что нужно помнить при программировании FIFO-каналов: идеология FIFO-каналов предполагает наличие «читателей» и «писателей». Если «писатель» пишет в канал, у которого нет «читателя», из ядра будет послан сигнал SIGPIPE.

26.4. Основные принципы System V IPC

Каждый объект IPC, то есть семафор, очередь сообщений или разделяемый сегмент памяти, имеет свой идентификатор, позволяющий ядру однозначно идентифицировать объект. Идентификатор уникален только для объектов данного типа, а не для всей системы. Например, в системе может быть очередь сообщений с идентификатором «111» и семафор с ID «111», но никогда не будет двух разных очередей с идентификатором «111».

Для получения уникального идентификатора системе нужен ключ (IPC Key), который согласовывается с процессом-сервером и процессом-клиентом. Ключ осуществляет связь между процессом-сервером и процессом- клиентом подобно тому, как маршрутизатор осуществляет связь между двумя компьютерами в разных подсетях.

Ключ генерируется приложением самостоятельно. Для этого используется функция ftok():

key_t ftok( char *pathname, char proj);

В случае успеха возвращается ключ, а в случае ошибки -1.

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

Ключ генерируется на основе номера inode первого аргумента и символов второго. Это не гарантия уникальности, поэтому и получается, что функция может возвращать уже используемый ключ.

key_t key1;

key_t key2;


key1 = ftok("/tmp/app", 'a');

key2 = ftok(".", 'd');

Просмотреть статус всех объектов IPC можно с помощью команды ipcs, выводящей состояние всех разделяемых сегментов памяти, семафоров и очередей сообщений.

Для удаления объекта IPC используется команда

ipcrm IPC_ID

Так как идентификатор IPC уникален только для объектов IPC определенного типа, вы должны указать тип объекта (msg — очередь сообщений, sem — семафор, shm — сегмент памяти) и его идентификатор.

Для работы с объектами IPC не забудьте подключить следующие заголовочные файлы:

#include

#include

#include

#include

#include /* для очередей */

#include /* для семафоров */

#include /* для разделяемых сегментов памяти */

26.5. Очереди сообщений

26.5.1. Основные структуры ядра для работы с очередями

Очередь сообщений — это связный список, находящийся в адресном пространстве ядра. Каждая очередь имеет свой уникальный идентификатор IPC.

Структура ядра msgbuf (описана в файле /usr/src/linux/include/linux/msg.h) является буфером сообщений:

struct msgbuf {

 long mtype; /* тип сообщения */

Перейти на страницу:

Все книги серии Полное руководство

Похожие книги

Полное руководство по Microsoft Windows XP
Полное руководство по Microsoft Windows XP

В книге известного американского автора описывается среда ОС Windows XP и принципы ее функционирования, приведен сравнительный анализ Windows XP с предшествующими версиями операционной системы Windows. Рассматриваются вопросы применения и модификации нового интерфейса с целью получения прямого доступа ко всем функциям Windows XP обсуждаются варианты подключения к компьютерным сетям. Несколько разделов посвящены работе с реестром и конфигурационными файлами, мультимедийным функциям и разнообразным системным службам, а также методам решения проблем с программным обеспечением и оборудованием. Особое внимание уделено обеспечению безопасности операционной системы.Издание адресовано пользователям и сетевым администраторам, желающим активно применять возможности операционной системы Windows XP (в том числе и недокументированные).

Питер Нортон , Джон Поль Мюллер

ОС и Сети, интернет / ОС и Сети / Книги по IT
Linux
Linux

Книга посвящена операционной системе Linux. Приводятся подробные сведения о ее особенностях и возможностях, идеологии файловой системы, инсталляции и основных командах, вопросах компиляции ядра, настройках и сервисах. Большое внимание уделяется организации на базе Linux различных серверов и служб: электронной почты, WWW, FTP, INN, Proxy, NTP, а также проблемам администрирования сети, обеспечения безопасной работы и другим вопросам. Описаны способы настройки под Linux рабочих станций, в т. ч. и бездисковых, установки и эксплуатации на них графических сред типа X Window, а также конфигурирование модемных соединений, принтеров и сканеров, отладка взаимодействия с Linux-машинами такой «экзотической» периферии, как карманные компьютеры, мобильные телефоны, TV-тюнеры и т. п. Рассматриваемые в книге конфигурационные файлы и структура каталогов соответствуют дистрибутиву Red Hat Linux 7.x, тем не менее, при минимальной адаптации все упоминаемые в книге пакеты устанавливаются в любом дистрибутиве Linux.Для начинающих администраторов или пользователей Linux.

Алексей Александрович Стахнов

ОС и Сети, интернет