Скачиваний:
90
Добавлен:
12.05.2015
Размер:
913.92 Кб
Скачать

13.10. Выводы по главе 13

Программные каналы и FIFO представляют собой базовые строительные блоки для множества приложений. Программные каналы обычно используются в интерпретаторе команд, а также внутри программ – в основном для обмена информацией между родительским и дочерним процессами. Можно исключить часть программного кода, относящегося к использованию каналов (pipe, fork, close, exec и waitpid), используя функции popen и pclose, которые берут на себя все тонкости и запускают интерпретатор команд.

Каналы FIFO похожи на программные каналы, но их создают с помощью функции mkfifo и затем открывают с помощью функции open. При открытии FIFO следует быть аккуратным, поскольку процесс может быть заблокирован, а зависит это от множества условий, перечисленных в табл. 13.1.

Используя программные каналы и FIFO, мы создали несколько вариантов приложений типа клиент-сервер: один сервер с несколькими клиентами, последовательный и параллельный серверы. Последовательный сервер единовременно обрабатывает запрос только от одного клиента; такие серверы обычно уязвимы для атак типа “отказ в обслуживании”. Параллельный сервер запускает отдельный процесс или поток для обработки запроса нового клиента.

Одной из особенностей программных каналов и FIFO является то, что данные по ним передаются в виде потоков байтов, аналогично соединению TCP. Деление этого потока на самостоятельные записи целиком предоставляется приложению. Мы увидим в главе 17, что очереди сообщений автоматически расставляют границы между записями, аналогично тому, как это делается в дейтаграммах UDP.

13.11. Упражнения по главе 13

13.1. Описывая функцию mkfifoв разделе 13.5, мы сказали, что для открытия существующего FIFO или создания нового, если его не существует, следует вызватьmkfifo, проверить, не случилась ли ошибкаEEXIST, и вызватьopen, если произошла эта ошибка. Что произойдет, если изменить логику работы и вызвать сначалаopen, а затемmkfifo, если FIFO не существует?

13.2. Удалите вызов функции open(с флагомO_WRONLY) для FIFO сервера влистинге 13.6и проверьте, приведет ли это к завершению работы сервера после отключения последнего клиента.

13.3. К листингу 13.6: мы отметили, что при запуске сервера его работа блокируется при первом вызове функцииopen(с флагомO_RDONLY) для FIFO сервера, пока этот канал FIFO не будет открыт на запись первым клиентом. Как можно избежать блокирования таким образом, чтобы оба последовательных вызова функцииopenдля FIFO сервера немедленно возвращали управление, а блокирование происходило при первом вызове функцииfgets?

13.4. Что произойдет с клиентом из листинга 13.7, если поменять порядок вызовов функцииopen?

13.5. Почему сигнал SIGPIPEотправляется процессу, в котором канал FIFO открыт на запись (табл. 13.1), после отключения последнего читающего клиента, а не читающему процессу после отключения последнего пишущего клиента?

13.6. Напишите небольшую тестирующую программу для определения того, возвращает ли функция fstatколичество байтов, находящихся в FIFO, в полеst_sizeструктурыstat.

Глава 14. Программные потоки

Соседние файлы в папке Chapter.4