- •Введение
- •Глава 1. Фундаментальные концепции unix Систем
- •Программы, процессы и потоки
- •Сигналы
- •Идентификаторы процессов, группы процессов и сеансы
- •Система прав
- •Другие атрибуты процесса
- •Межпроцессное взаимодействие
- •Использование системных вызовов
- •Краткие описания функций и обработка ошибок
- •Контрольные вопросы
- •Литература
- •Глава 2. Базовые операции ввода-вывода
- •Файловые операции ввода - вывода
- •Стандартные дескрипторы
- •Системные вызовы open и creat
- •Системный вызов umask
- •Системный вызов unlink
- •Текущая позиция в файле
- •Системный вызов write
- •2.8. Системный вызов read
- •2.9. Системный вызов close
- •2.10. Системный вызов lseek
- •2.11. Системные вызовы pread и pwrite
- •2.12. Системные вызовы truncate и ftruncate
- •Контрольные вопросы
- •Литература
- •Глава 3. Дополнительные операции файлового ввода_вывода
- •Низкоуровневый доступ к файловой системе
- •Жесткие и символические ссылки
- •Системный вызов getcwd
- •Отображение метаданных файла
- •Системные вызовы getpwuid, getgrgid и getlogin
- •Каталоги
- •Системные вызовы chdir и fchdir
- •Системные вызовы mkdir и rmdir
- •Контрольные вопросы
- •Литература
- •Глава 4. Процессы и потоки
- •4.1. Среда окружения
- •Системный вызов exec
- •Системный вызов fork
- •Завершение процесса и системные вызовы exit
- •Системные вызовы wait, waitpid и waitid
- •Получение и изменение идентификаторов пользователя и группы
- •Получение и изменение приоритета
- •Контрольные вопросы
- •Литература
- •Глава 5. Механизмы межпроцессного взаимодействия
- •5.1. Каналы
- •5.2. Системные вызовы dup и dup2
- •5.3. Двунаправленное взаимодействие с использованием однонаправленных каналов
- •Контрольные вопросы
- •Литература
- •Глава 6.Механизмы взаимодействия процессов
- •Именованные каналы (fifo)
- •Системные вызовы для работы с очередями сообщений posix
- •Семафоры
- •Системные вызовы для работы с общей памятью posix
- •Контрольные вопросы
- •Литература
- •Глава 7.Сетевое взаимодействие и сокеты
- •Основные системные вызовы для работы с сокетами, образующими логические соединения
- •Обслуживание нескольких клиентов
- •Адресация сокетов
- •In_port_t sin_port; /* номер порта (uint16_t) */
- •In_addr_t s_addr; /* адрес iPv4 (uint32_t) */
- •Домен адресов af_inet6
- •In_port_t sin6_port; /* номер порта (uint16_t) */
- •Доменная система именования
- •Параметры сокетов
- •Контрольные вопросы
- •Литература
- •Глава 8.Сигналы и таймеры
- •Введение в сигналы
- •Жизненный цикл сигналов
- •Типы сигналов
- •Системный вызов sigaction
- •Контрольные вопросы
- •Литература
- •Заключение
- •Список литературы
- •Глава 2. Базовые операции ввода-вывода 14
- •Глава 3. Дополнительные операции файлового ввода_вывода 25
- •Глава 6. Механизмы взаимодействия процессов 58
Другие атрибуты процесса
Каждому открытому процессом файлу соответствует один дескриптор открытого файла, а каждому созданному процессом неименованному каналу – два таких дескриптора. Дочерний процесс не наследует от родителя дескрипторы открытых файлов, он наследует их дубликаты. Тем не менее, они являются индексами в той же общесистемной таблице открытых файлов, а это кроме всего прочего означает, что родительский и дочерний процессы используют одно и то же смещение в файле (байт, начиная с которого будут прочитаны или записаны данные при выполнении следующей операции чтения или записи).
Приоритет процесса используется планировщиком ядра. Любой процесс может понизить свой приоритет, выполнив системный вызов nice. Процесс суперпользователя может при помощи этого системного вызова повысить свой приоритет.
Соответствующий процессу лимит размера файла может иметь меньшее значение, чем общесистемный лимит. Это предотвращает запись огромных файлов неопытными пользователями. Процесс суперпользователя может увеличить свой лимит.
Межпроцессное взаимодействие
В системах Unix процессы могли взаимодействовать друг с другом, используя общие смещения в файлах, сигналы, трассировку процесса, файлы и каналы. Позднее в этот список были добавлены именованные каналы (FIFO), за которыми последовали семафоры, блокировки файлов, сообщения, общая память и сетевые сокеты.
Общие смещения в файлах редко используются для реализации межпроцессного взаимодействия. Один процесс может задать смещение, указывающее на некоторое место в файле, а второй процесс может узнать, куда оно указывает. Это смещение и было бы переданными данными. Чтобы совместно использовать смещение в файле, процессы должны быть связанными, поэтому они могут с тем же успехом воспользоваться каналами.
Если одному процессу нужно сообщить другому о каком-то событии, можно использовать сигналы. Например, спулер печати мог бы посылать сигнал процессу, выполняющему печать, при поступлении файла в очередь печати. Однако сигналы недостаточно информативны. Кроме того, сигнал прерывает работу процесса-получателя, что делает программирование более сложным в сравнении с подходом, при котором получатель принимает информацию, когда он готов к этому. Как правило, сигналы используются просто для завершения процессов или для информирования об очень необычных событиях.
Трассировка процесса позволяет родительскому процессу управлять выполнением дочернего процесса. Так как при этом родитель может читать и записывать данные дочернего процесса, оба процесса могут свободно взаимодействовать. Трассировка процесса используется только отладчиками, так как она слишком сложна и небезопасна для обычного применения.
Самой популярной формой межпроцессного взаимодействия является использование файлов. Например, мы можем записать файл при помощи редактора vi и затем выполнить его в интерпретаторе python. Однако если два процесса выполняются одновременно, файлы неудобны. Это имеет две причины: во-первых, процесс-читатель, работающий быстрее процесса-писателя, при достижении конца файла может решить, что взаимодействие завершено. Во-вторых, по мере взаимодействия процессов файл становится все больше и больше. Иногда процессы взаимодействуют многие дни, передавая друг другу миллиарды байтов. Файловая система может не справиться с такой нагрузкой.
При синхронизации файлов лучше использовать каналы. Канал не является разновидностью обычного файла, хотя он имеет, индексный узел и на него нет ссылок. Операции чтения и записи канала в целом похожи на чтение и запись файла, но имеет и некоторые важные отличия: если писатель отстает от читателя, читатель блокируется до появления данных. Если писатель намного обгоняет читателя, он блокируется и ждет читателя, поэтому ядру не приходится иметь дело с очень большими очередями. Наконец, как только какой-то байт прочитан, он уходит в небытие, так что при длительном выполнении процессов, соединенных посредством каналов, файловая система не переполняется.
Каналы хорошо известны пользователям командных оболочек. Например, команда ls | wc , позволяющая узнать число файлов, также используется канал. Ядро поддерживает гораздо более общие средства работы с каналами, чем командные оболочки.
Каналы имеют три основных недостатка:
процессы, взаимодействующие при помощи канала, должны быть родственными, т.е. они должны быть родителем и потомком или двумя потомками одного родителя. Это слишком жесткое ограничение: например, если один процесс является менеджером базы данных, а второй относится к приложению, которому нужно обращаться к базе данных, то этот подход непременим;
при записи блоков, объем которых превышает локально заданный максимум (скажем, 4096 байтов), атомарность операций не гарантируется. Это не позволяет использовать каналы при наличии нескольких процессов-писателей: их данные могут перемешаться;
быстродействие каналов может оказаться слишком низким, потому что данные пользовательского процесса-писателя копируются в структуры ядра, после чего передаются другому пользовательскому процессу-читателю. Никакой дисковый ввод-вывод при этом не выполняется, но копирование само по себе может оказаться слишком длительным для некоторых требовательных приложений.
Из-за этих недостатков были разработаны усовершенствованные методики межпроцессного взаимодействия.
Именованные каналы устраняют первый недостаток каналов. Именованный канал является специальным файлом, и любой процесс, имеющий такое право, может открыть его для чтения или записи. Именованные каналы не лишены второго и третьего недостатков каналов: они не исключают чередование при записи больших блоков данных и иногда работают слишком медленно.
Семафором называют счетчик, не позволяющий получить доступ к одному ресурсу сразу двум или более процессам.
Блокировка файла – специализированный семафор, не позволяющий сразу двум или более процессам, обратиться к тому же сегменту файла. Обычно она эффективна только в том случае, если процессы ее проверяют.
Сообщение представляет собой небольшой блок данных, который может быть отправлен в очередь сообщений. Имеются разные типы сообщений. Получать сообщения из очереди может любой процесс, имеющий соответствующие права. Процесс может извлечь из очереди или первое сообщение, или первое сообщение конкретного типа, или первое сообщение, тип которого относится к определенной группе.
Общая память потенциально является самой быстрой технологией межпроцессного взаимодействия. Этот подход основан на отображении одной области памяти на адресные пространства двух или более процессов. Данные, записанные в общую память, сразу же становятся доступны процессам-читателям. Для синхронизации читателя и писателя используется семафор или сообщение.
Сетевое межпроцессное взаимодействие с использованием сокетов выполняется при помощи соответствующих системных вызовов, таких как bind, connect, accept. Сокеты позволяют взаимодействовать по локальной сети или Интернету с процессом, выполняемым на другом компьютере, причем этот компьютер может не быть Unix-системой. Он может работать под управлением Windows или другой ОС. Он даже может быть сетевым принтером.