Последние три типа IPC обычно обобщенно называют
Во многих версиях UNIX есть еще одно средство IPC — сокеты, впервые предложенные в BSD UNIX (им посвящен отдельный раздел главы).
Сигналы изначально были предложены как средство уведомления об ошибках, но могут использоваться и для элементарного IPC, например, для синхронизации процессов или для передачи простейших команд от одного процесса к другому.[42] Однако использование сигналов в качестве средства IPC ограничено из-за того, что сигналы очень ресурсоемки. Отправка сигнала требует выполнения системного вызова, а его доставка — прерывания процесса-получателя и интенсивных операций со стеком процесса для вызова функции обработки и продолжения его нормального выполнения. При этом сигналы слабо информативны и их число весьма ограничено. Поэтому сразу переходим к следующему механизму — каналам.
Каналы
Вспомните синтаксис организации программных каналов при работе в командной строке shell:
cat myfile | wc
При этом (стандартный) вывод программы
12 45 260
что будет означать количество строк, слов и символов в файле myfile.
Таким образом, два процесса обменялись данными. При этом использовался программный канал, обеспечивающий
Для создания канала используется системный вызов
int pipe(int* fildes);
который возвращает два файловых дескриптора — fildes[0]
для записи в канал и fildes[1]
для чтения из канала. Теперь, если один процесс записывает данные в fildes[0]
, другой сможет получить эти данные из fildes[1]
. Вопрос только в том, как другой процесс сможет получить сам файловый дескриптор fildes[1]
?
Вспомним наследуемые атрибуты при создании процесса. Дочерний процесс наследует и разделяет все назначенные файловые дескрипторы родительского. То есть доступ к дескрипторам fildes
канала может получить сам процесс, вызвавший
Хотя в приведенном примере может показаться, что процессы
Рис. 3.17. Создание канала между задачами
FIFO
Название каналов FIFO происходит от выражения First In First Out (первый вошел — первый вышел). FIFO очень похожи на каналы, поскольку являются однонаправленным средством передачи данных, причем чтение данных происходит в порядке их записи. Однако в отличие от программных каналов, FIFO имеют имена, которые позволяют независимым процессам получить к этим объектам доступ. Поэтому иногда FIFO также называют
FIFO является отдельным типом файла в файловой системе UNIX (
int mknod(char *pathname, int mode, int dev);
где pathname
— имя файла в файловой системе (имя FIFO),
mode
— флаги владения, прав доступа и т.д. (см. поле mode файла),
dev
— при создании FIFO игнорируется.
FIFO может быть создан и из командной строки shell:
$ mknod
После создания FIFO может быть открыт на запись и чтение, причем запись и чтение могут происходить в разных независимых процессах.
Каналы FIFO и обычные каналы работают по следующим правилам:
1. При чтении меньшего числа байтов, чем находится в канале или FIFO, возвращается требуемое число байтов, остаток сохраняется для последующих чтений.
2. При чтении большего числа байтов, чем находится в канале или FIFO, возвращается доступное число байтов. Процесс, читающий из канала, должен соответствующим образом обработать ситуацию, когда прочитано меньше, чем заказано.
3. Если канал пуст и ни один процесс не открыл его на запись, при чтении из канала будет получено 0 байтов. Если один или более процессов открыли канал для записи, вызов O_NDELAY
).
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии