Аллен Питер В.
Шрифт:
Листинг 26.2. Дочерний процесс — исходный код /usr/bin/child
26.3. Каналы типа FIFO
Канал FIFO — это канал, основанный на принципе очереди: «первым вошел, первым вышел». От обычного канала канал FIFO отличается следующим:
♦ Канал FIFO сохраняется в файловой системе в виде файла, поэтому каналы FIFO называются именованными.
♦ С именованным каналом, как с обычным файлом, могут работать все процессы, а не только предок и потомки.
♦ В отличие от полудуплексного канала, находящегося в ядре, канал FIFO находится в файловой системе и остается там даже после завершения обмена данными. Для следующего использования канала его не нужно заново создавать.
Создать именованный канал можно с помощью командного интерпретатора:
или системного вызова mknod:
Функция mknod используется не только для создания каналов FIFO. Она может создать любой i-узел (inode) файловой системы: файл, устройство, канал FIFO. Функция возвращает 0, если создание узла прошло успешно, или -1, если произошла ошибка. Проанализировать ошибку можно с помощью переменной
♦ EFAULT, ENOTDIR, ENOENT — неправильно задан путь;
♦ EACCESS — у вас недостаточно прав;
♦ ENAMETOOLONG — слишком длинный путь.
Пример создания FIFO-канала:
В текущем каталоге будет создан канал FIFO с правами доступа 0666.
Указывая права доступа создаваемого файла, помните, что они находятся под влиянием umask. Поэтому, если вы хотите установить истинное значение прав доступа, используйте системный вызов umask(0), чтобы временно отключить влияние umask:
Рассмотрим программу, создающую FIFO-канал и ожидающую данных по этому каналу. Программа после создания канала будет ожидать данных по этому каналу и не завершится до тех пор, пока вы не «убьете» процесс.
Листинг 26.3. Процесс-читатель