Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
1. Сначала попробуйте прочесть (пустой) файл FIFO:
$ <b>cat < /tmp/my_fifo</b>2. Теперь попытайтесь записать в FIFO. Вам придется использовать другой терминал, поскольку первая команда в данный момент "зависла" в ожидании появления каких-нибудь данных в FIFO:
$ <b>echo "Hello World" > /tmp/my_fifo</b>Вы увидите вывод команды
catcat3. Можно выполнить обе команды одновременно, переведя первую в фоновый режим:
$ <b>cat < /tmp/my_fifo &</b>[1] 1316$ <b>echo "Hello World" > /tmp/my_fifo</b>Hello World[1]+ Done cat </tmp/my_fifo$Как это работает
Поскольку в канале FIFO не было данных, обе команды,
catechoНа третьем шаге процесс
catechocatcatreadcatТеперь, когда вы посмотрели, как ведут себя каналы FIFO при обращении к ним с помощью программ командной строки, давайте рассмотрим более подробно программный интерфейс, предоставляющий больше возможностей управления операциями чтения и записи при организации доступа к FIFO.
В отличие от канала, созданного вызовом
pipeopencloseopenОсновное ограничение при открытии канала FIFO состоит в том, что программа не может открыть FIFO для чтения и записи с режимом
O_RDWRO_RDWRЕсли вы действительно хотите передавать данные между программами в обоих направлениях, гораздо лучше использовать пару FIFO или неименованных каналов, по одному для каждого направления передачи, или (что нетипично) явно изменить направление потока данных, закрыв и снова открыв канал FIFO. Мы вернемся к двунаправленному обмену данными с помощью каналов FIFO чуть позже в этой главе.
Другое различие между открытием канала FIFO и обычного файла заключается в использовании флага
open_flagopenO_NONBLOCKopenopenreadwriteСуществует четыре допустимых комбинации значений
O_RDONLYO_WRONLYO_NONBLOCKopen(const char *path, O_RDONLY);В этом случае вызов
opencatopen(const char *path, O_RDONLY | O_NONBLOCK);Теперь вызов
openopen(const char *path, O_WRONLY);В данном случае вызов
openopen(const char *path, O_WRONLY | O_NONBLOCK);Этот вариант вызова всегда будет возвращать управление немедленно, но если ни один процесс не открыл этот канал FIFO для чтения,
openОбратите внимание на асимметрию в использовании
O_NONBLOCKO_RDONLYO_WRONLYopenopencloseO_NONBLOCKВыполните упражнение 13.11.
Теперь рассмотрим, как можно использовать поведение вызова
openO_NONBLOCK1. Начните с заголовочных файлов, директивы
#define#include <unistd.h>
