Создание процессов
100%

Процессы · Урок 4

Создание процессов

Узнайте, как fork, exec, PID и родительские связи участвуют в создании процессов Linux.

Процессы Linux образуют отношения родителей и потомков. Оболочка обычно запускает внешнюю команду, создавая дочерний процесс и настраивая его на выполнение запрошенной программы. Классическое объяснение разделяет эту работу на операции fork и exec.

Создание потомка через `fork`

Системный вызов fork() создаёт дочерний процесс на основе вызывающего. Родитель и потомок продолжают выполнение с точки возврата fork, но получают разные возвращаемые значения и имеют разные PID.

Потомок получает логически отдельное состояние процесса. Linux может сначала совместно использовать физические страницы памяти посредством copy-on-write, копируя страницу только при её изменении одним из процессов. Открытые файловые дескрипторы наследуются и ссылаются на те же нижележащие описания открытых файлов, поэтому такие сведения, как смещения файлов, могут оставаться общими.

Что создаёт успешный fork()?

Замена программы через `execve`

Вызов execve() загружает новую программу в вызывающий процесс. При успехе он заменяет образ процесса и не возвращается к старой программе. PID остаётся прежним, поскольку execve() не создаёт новый процесс.

Поэтому многие команды оболочки следуют схеме fork-exec:

  1. Оболочка создаёт потомка.
  2. Потомок подготавливает перенаправления и другое состояние выполнения.
  3. Потомок выполняет запрошенную программу.
  4. Оболочка ожидает или продолжает работу в зависимости от выполнения на переднем или заднем плане.

Библиотеки и приложения могут предоставлять высокоуровневые интерфейсы вроде posix_spawn(), а в Linux есть дополнительные примитивы, например clone(). Знакомая модель fork-exec остаётся полезной, хотя и не является единственным интерфейсом.

Что происходит с PID процесса после успешного execve()?

Проверка идентификаторов родителя и потомка

PID обозначает процесс, а PPID — его родителя. Явно запросите эти поля:

$ ps -o pid,ppid,stat,cmd

Если оболочка запускает ps, PID оболочки обычно появится как PPID этого процесса ps. Время имеет значение: краткоживущие процессы могут завершиться до того, как отдельное наблюдение их захватит.

Что представляет PPID в списке процессов?

PID 1 и смена родителя

Ядро запускает первый процесс пространства пользователя с PID 1. В зависимости от системы это может быть systemd, другая реализация init или небольшой init внутри контейнера либо пространства имён PID. PID 1 запускает и контролирует части пользовательской среды и имеет особые обязанности по сигналам и сбору осиротевших процессов.

Если родитель завершается раньше потомка, потомок передаётся подходящему subreaper или процессу init своего пространства имён PID. Он не обязан завершаться лишь потому, что исходный родитель прекратил работу.

Какое утверждение о PID 1 верно?

Урок завершён

Вы завершили Создание процессов

Теперь вы можете проследить классическую последовательность создания процесса Linux.

  • Используйте fork() для создания потомка с отдельным PID.

  • Используйте execve() для замены образа процесса без изменения PID.

  • Читайте PID и PPID для определения отношений родителя и потомка.

  • Распознавайте PID 1 и subreaper как назначения для потомков со сменившимся родителем.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Следующий Урок
Назад к Процессы