Linux программирование в примерах
Шрифт:
3. Усовершенствуйте
4. Измените
5. Добавьте опцию
6. Используя
7. Усовершенствуйте свою версию
8. Можете ли вы использовать
9. Используя
10. Набор процедур BSD
Прочтите справочную страницу fts(3). (Для удобства ее можно распечатать.) Перепишите свою частную версию chown для использования
11. Посмотрите справочную страницу find(1). Если бы вы пытались написать
Часть 2
Процессы, IPC и интернационализация
Глава 9
Управление процессами и каналы
Как мы говорили в главе 1 «Введение», если бы нужно было резюмировать Unix (а следовательно, и Linux) в трёх словах, это были бы «файлы и процессы». Теперь, когда мы увидели, как работать с файлами и каталогами, время взглянуть на оставшуюся часть утверждения: процессы. В частности, мы исследуем, как создаются и управляются процессы, как они взаимодействуют с открытыми файлами и как они могут взаимодействовать друге другом. Последующие главы исследуют сигналы — грубый способ дать возможность одному процессу (или ядру) сообщить другому о том, что произошло некоторое событие — и проверку прав доступа.
В данной главе картина начинает усложняться. В частности, для полноты мы должны упомянуть о вещах, которые не будут рассматриваться до конца главы или до конца книги В таких случаях мы предусмотрели ссылки вперед, но вы должны быть способны без подготовки уловить суть каждого раздела.
9.1. Создание и управление процессами
В отличие от многих предшествующих и последующих операционных систем, создание процессов в Unix задумывалось (и было сделано) дешевым. Более того, Unix разделяет идеи «создания нового процесса» и «запуска данной программы в процессе». Это было элегантное проектное решение, которое упрощает многие операции.
9.1.1. Создание процесса:
Первым шагом в запуске
новой программы является вызов
Использование
Вот ключ: оба процесса выполняют одну и ту же программу. Два процесса могут различить себя, основываясь на возвращённом
Отрицательное
Если была ошибка,
Нулевое
В порожденном процессе
Положительное
В родительском процессе
Код шаблона для создания порожденного процесса выглядит следующим образом:
На языке Unix, помимо названия системного вызова, слово «fork» является и глаголом, и существительным [88] . Мы можем сказать, что «один процесс ответвляет другой», и что «после разветвления работают два процесса». (Думайте «развилка (fork) на дороге», а не «вилка (fork), нож и ложка».)
9.1.1.1. После
Порожденный процесс «наследует» идентичные копии большого числа атрибутов от родителя. Многие из этих атрибутов специализированы и здесь неуместны. Поэтому следующий список намеренно неполон. Существенны следующие:
88
Fork (англ.) — «n вилка, развилка, v разветвлять, ответвлять» — Примеч. перев.
• Окружение, см. раздел 2.4 «Окружение».
• Все открытые файлы и открытые каталоги; см. раздел 4.4.1 «Понятие о дескрипторах файлов» и раздел 5.3.1 «Базовое чтение каталогов».
• Установки umask; см. раздел 4.6 «Создание файлов».
• Текущий рабочий каталог; см раздел 8.4.1 «Смена каталога:
• Корневой каталог; см. раздел 8.6 «Изменение корневого каталога:
• Текущий приоритет (иначе называемый «значение nice»; вскоре мы это обсудим; см раздел 9.1.3 «Установка приоритета процесса: