Уильям Стивенс - UNIX - взаимодействие процессов

Здесь есть возможность читать онлайн «Уильям Стивенс - UNIX - взаимодействие процессов» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Санкт-Петербург, Год выпуска: 2003, ISBN: 2003, Издательство: Питер, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

UNIX: взаимодействие процессов: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «UNIX: взаимодействие процессов»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

UNIX: взаимодействие процессов — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «UNIX: взаимодействие процессов», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

10 /* создание FIFO сервера с известным именем. ОК, если уже существует */

11 if ((mkfifo(SERV_FIFO, FILE_MODE) < 0) && (errno != EEXIST))

12 err_sys("can't create %s", SERV_FIFO);

13 /* открытие FIFO-cepвepa на чтение */

14 readfifo = Open(SERV_FIFO, O_RDONLY, 0);

15 dummyfd = Open(SERV_FIFO, O_WRONLY, 0); /* не используется */

16 while ((n = Readline(readfifo, buff, MAXLINE)) > 0) {

17 if (buff[n-1] == '\n')

18 n--; /* delete newline from readline() */

19 buff[n] = '\0'; /* полное имя, завершаемое 0 */

20 if ((ptr = strchr(buff, ' ')) == NULL) {

21 err_msg("bogus request: ls", buff);

22 continue;

23 }

24 *ptr++ = 0; /* идентификатор процесса, указатель на имя файла */

25 pid = atol(buff);

26 snprintf(fifoname, sizeof(fifoname), "/tmp/fifo.%ld", (long) pid);

27 if ( (writefifo = open(fifoname, O_WRONLY, 0)) < 0) {

28 err_msg("cannot open: ls", fifoname);

29 continue;

30 }

31 if ((fd = open(ptr, O_RDONLY)) < 0) {

32 /* ошибка, нужно сообщить клиенту */

33 snprintf(buff + n, sizeof(buff) – n, ": can't open, %s\n",

34 strerror(errno));

35 n = strlen(ptr);

36 Write(writefifo, ptr, n);

37 Close(writefifo);

38

39 } else {

40 /* успешное открытие, копируем файл */

41 while ((n = Read(fd, buff, MAXLINE)) > 0)

42 Write(writefifo, buff, n);

43 Close(fd);

44 Close(writefifo);

45 }

46 }

47 }

Создание канала и открытие его только для записи и только для чтения

10-15 Сервер создает канал FIFO с известным именем, обрабатывая ситуацию, когда такой канал уже существует. Затем этот канал открывается дважды: один раз только для чтения, а второй — только для записи. Дескриптор readfifo используется для приема запросов от клиентов, а дескриптор dummyfd не используется вовсе. Причина, по которой нужно открыть канал для записи, видна из табл. 4.1. Если канал не открыть на запись, то при завершении работы очередного клиента этот канал будет опустошаться и сервер будет считывать 0, означающий конец файла. Пришлось бы каждый раз закрывать канал вызовом close, а затем заново открывать его с флагом O_RDONLY, что приводило бы к блокированию демона до подключения следующего клиента. Мы же всегда будем иметь дескриптор, открытый на запись, поэтому функция read не будет возвращать 0, означающий конец файла, при отсутствии клиентов. Вместо этого сервер просто будет блокироваться при вызове read, ожидая подключения следующего клиента. Этот трюк упрощает код программы-сервера и уменьшает количество вызовов open для канала сервера.

При запуске сервера первый вызов open (с флагом O_RDONLY) приводит к блокированию процесса до появления первого клиента, открывающего канал сервера на запись (см. табл. 4.1). Второй вызов open (с флагом O_WRONLY) не приводит к блокированию, поскольку канал уже открыт на запись.

Считывание запроса от клиента

16 Каждый запрос, принимаемый от клиента, представляет собой одну строку, состоящую из идентификатора процесса, пробела и полного имени требуемого файла. Эта строка считывается функцией readline (приведенной в [24, с.79]).

Анализ запроса клиента

17-26 Символ перевода строки, возвращаемый функцией readline, удаляется. Этот символ может отсутствовать только в том случае, если буфер был заполнен, прежде чем был обнаружен символ перевода строки, либо если последняя введенная строка не была завершена этим символом. Функция strchr возвращает указатель на первый пробел в этой строке, который затем увеличивается на единицу, чтобы он указывал на первый символ полного имени файла, следующего за пробелом. Полное имя канала клиента формируется из его идентификатора процесса, и этот канал открывается сервером на запись.

Открытие файла и отправка его в FIFO клиента

27-44 Оставшаяся часть кода пpoгрaммы-cepвepa аналогична функции server из листинга 4.3. Программа открывает файл; если при этом возникает ошибка — клиенту отсылается сообщение о ней. Если открытие файла завершается успешно, его содержимое копируется в канал клиента. После завершения копирования открытый сервером «конец» (дескриптор) канала клиента должен быть закрыт с помощью функции close, чтобы функция read вернула пpoгрaммe-клиeнтy значение 0 (конец файла). Сервер не удаляет канал клиента; клиент должен самостоятельно позаботиться об этом после приема от сервера символа конца файла. Текст пpoгрaммы-клиeнтa приведен в листинге 4.11.

Листинг 4.11. Клиент, связывающийся с сервером (листинг 4.10) с помощью канала FIFO

//fifocliserv/mainclient.с

1 #include "fifo.h"

2 int

3 main(int argc, char **argv)

4 {

5 int readfifo, writefifo;

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «UNIX: взаимодействие процессов»

Представляем Вашему вниманию похожие книги на «UNIX: взаимодействие процессов» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «UNIX: взаимодействие процессов»

Обсуждение, отзывы о книге «UNIX: взаимодействие процессов» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x