Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
1. Сначала попробуйте прочесть (пустой) файл FIFO:
$ <b>cat < /tmp/my_fifo</b>
2. Теперь попытайтесь записать в FIFO. Вам придется использовать другой терминал, поскольку первая команда в данный момент "зависла" в ожидании появления каких-нибудь данных в FIFO:
$ <b>echo "Hello World" > /tmp/my_fifo</b>
Вы увидите вывод команды
cat
cat
3. Можно выполнить обе команды одновременно, переведя первую в фоновый режим:
$ <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 не было данных, обе команды,
cat
echo
На третьем шаге процесс
cat
echo
cat
cat
read
cat
Теперь, когда вы посмотрели, как ведут себя каналы FIFO при обращении к ним с помощью программ командной строки, давайте рассмотрим более подробно программный интерфейс, предоставляющий больше возможностей управления операциями чтения и записи при организации доступа к FIFO.
В отличие от канала, созданного вызовом
pipe
open
close
open
Основное ограничение при открытии канала FIFO состоит в том, что программа не может открыть FIFO для чтения и записи с режимом
O_RDWR
O_RDWR
Если вы действительно хотите передавать данные между программами в обоих направлениях, гораздо лучше использовать пару FIFO или неименованных каналов, по одному для каждого направления передачи, или (что нетипично) явно изменить направление потока данных, закрыв и снова открыв канал FIFO. Мы вернемся к двунаправленному обмену данными с помощью каналов FIFO чуть позже в этой главе.
Другое различие между открытием канала FIFO и обычного файла заключается в использовании флага
open_flag
open
O_NONBLOCK
open
open
read
write
Существует четыре допустимых комбинации значений
O_RDONLY
O_WRONLY
O_NONBLOCK
open(const char *path, O_RDONLY);
В этом случае вызов
open
cat
open(const char *path, O_RDONLY | O_NONBLOCK);
Теперь вызов
open
open(const char *path, O_WRONLY);
В данном случае вызов
open
open(const char *path, O_WRONLY | O_NONBLOCK);
Этот вариант вызова всегда будет возвращать управление немедленно, но если ни один процесс не открыл этот канал FIFO для чтения,
open
Обратите внимание на асимметрию в использовании
O_NONBLOCK
O_RDONLY
O_WRONLY
open
open
close
O_NONBLOCK
Выполните упражнение 13.11.
Теперь рассмотрим, как можно использовать поведение вызова
open
O_NONBLOCK
1. Начните с заголовочных файлов, директивы
#define
#include <unistd.h>