Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

До сих пор вы могли передавать данные только между связанными программами, т.е. программами, которые стартовали из общего процесса-предка. Часто это очень неудобно, хотелось бы, чтобы и у несвязанных процессов была возможность обмениваться данными.

Вы можете сделать это с помощью каналов FIFO, часто называемых именованными каналами. Именованный канал — это файл специального типа (помните, что в ОС Linux все, что угодно, — файл!), существующий в виде имени в файловой системе, но ведущий себя как неименованные каналы, которые вы уже встречали.

Вы можете создавать именованные

каналы из командной строки и внутри программы. С давних времен программой создания их в командной строке была команда
mknod
:

$ mknod имя_файла p

Однако команды

mknod
нет в списке команд X/Open, поэтому она включена не во все UNIX-подобные системы. Предпочтительнее применять в командной строке

$ mkfifo имя_файла

Примечание

У некоторых более старых версий UNIX была только команда

mknod
. В стандарте X/Open issue 4 Version 2 есть вызов функции
mknod
, но не программа командной строки. ОС Linux, как всегда настроенная дружелюбно, предлагает оба варианта:
mknod
и
mkfifo
.

Внутри программы можете применять два разных вызова:

#include <sys/types.h>

#include <sys/stat.h>

int mkfifo(const char *filename, mode_t mode);

int mknod(const char* filename, mode_t mode | S_IFIFO, (dev_t)0);

Помимо команды

mknod
вы можете использовать функцию
mknod
для создания файлов специальных типов. Единственный переносимый вариант применения этой функции, создающий именованный канал, — использование значения 0 типа
dev_t
и объединений с помощью операции or режима доступа к файлу и
S_IFIFO
. В примерах мы будем применять более простую функцию
mkfifo
.

Итак, выполните упражнение 13.9.

Упражнение 13.9. Создание именованного канала

Далее приведен исходный текст примера fifo1.c.

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

int main {

 int res = mkfifo("/tmp/my_fifo", 0777);

 if (res == 0) printf ("FIFO created\n");

 exit(EXIT_SUCCESS);

}

Вы можете создать канал и заглянуть в него:

$ ./fifo1

FIFO created

$ ls -lF /tmp/my_fifo

prwxr-xr-x 1 rick users 0 2007-06-16 17:18 /tmp/my_fifo|

Обратите

внимание на то, что первый символ вывода —
р
, обозначающий канал. Символ
|
в конце добавлен опцией
– F
команды
ls
и тоже обозначает канал.

Как это работает

Программа применяет функцию

mkfifo
для создания специального файла. Несмотря на то, что запрашиваете режим
0777
, он заменяется пользовательской маской (
umask
), устанавливаемой (в данном случае
022
) точно так же, как при создании обычного файла, поэтому у результирующего файла режим
755
. Если ваша
umask
установлена иначе, например, ее значение
0002
, вы увидите другие права доступа у созданного файла.

Удалить FIFO можно как традиционный файл с помощью команды

rm
или внутри программы посредством системного вызова
unlink
.

Доступ к FIFO

У именованных каналов есть одно очень полезное свойство: поскольку они появляются в файловой системе, их можно применять в командах на месте обычного имени файла. Прежде чем вы продолжите программирование с использованием созданного вами файла FIFO, давайте исследуем поведение такого файла с помощью обычных команд для работы с файлом (упражнение 13.10).

Упражнение 13.10. Организации доступа к файлу FIFO

1. Сначала попробуйте прочесть (пустой) файл FIFO:

$ cat < /tmp/my_fifo

2. Теперь попытайтесь записать в FIFO. Вам придется использовать другой терминал, поскольку первая команда в данный момент "зависла" в ожидании появления каких-нибудь данных в FIFO:

$ echo "Hello World" > /tmp/my_fifo

Вы увидите вывод команды

cat
. Если не посылать никаких данных в канал FIFO, команда
cat
будет ждать до тех пор, пока вы не прервете ее выполнение, традиционно комбинацией клавиш <Ctrl>+<C>.

3. Можно выполнить обе команды одновременно, переведя первую в фоновый режим:

$ cat < /tmp/my_fifo &

[1] 1316

$ echo "Hello World" > /tmp/my_fifo

Hello World

[1]+ Done cat </tmp/my_fifo

$

Как это работает

Поскольку в канале FIFO не было данных, обе команды,

cat
и
echo
, приостанавливают выполнение, ожидая, соответственно, поступления каких-нибудь данных и какого-либо процесса для их чтения.

Поделиться:
Популярные книги

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали

Гримуар темного лорда IV

Грехов Тимофей
4. Гримуар темного лорда
Фантастика:
фэнтези
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда IV

Старый, но крепкий

Крынов Макс
1. Культивация без насилия
Фантастика:
рпг
уся
попаданцы
5.00
рейтинг книги
Старый, но крепкий

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Александр Агренев. Трилогия

Кулаков Алексей Иванович
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Александр Агренев. Трилогия

#Бояръ-Аниме. Газлайтер. Том 24

Володин Григорий Григорьевич
24. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 24

Как я строил магическую империю 6

Зубов Константин
6. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 6

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

Кадет Морозов

Шелег Дмитрий Витальевич
4. Живой лёд
Фантастика:
боевая фантастика
5.72
рейтинг книги
Кадет Морозов

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый V

Я еще барон. Книга III

Дрейк Сириус
3. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще барон. Книга III

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4

Дважды одаренный. Том II

Тарс Элиан
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Дважды одаренный. Том II