← Назад к вопросам

Что такое форк процесса в Linux?

1.2 Junior🔥 171 комментариев
#Linux и администрирование#Скриптинг и программирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое форк процесса в Linux?

Форк процесса — это один из ключевых механизмов создания новых процессов в операционной системе Linux и других UNIX-подобных системах. Это системный вызов (fork()), который позволяет существующему процессу (родительскому) создать точную копию самого себя (процесс-ребёнок).

Механизм работы fork()

Когда процесс выполняет вызов fork(), операционная система выполняет следующие действия:

  • Создание новой записи в таблице процессов: ОС создаёт новую структуру процесса (PCB — Process Control Block) для ребёнка.
  • Копирование памяти родителя: Система создаёт копию виртуального адресного пространства родительского процесса для ребёнка. Это включает код (текстовый сегмент), данные (сегменты данных и heap), стек и другие регионы памяти.
  • Копирование контекста: Копируются многие атрибуты родителя: открытые файловые дескрипторы (они часто совместно используются), идентификатор пользователя и группы, текущий рабочий каталог, маски сигналов, окружение и др.
  • Возврат разных значений: После создания ребёнка вызов fork() возвращает управление в обоих процессах. В родительском процессе возвращается PID (Process ID) нового ребёнка, а в процессе-ребёнке возвращается 0. Это ключевое отличие позволяет каждому процессу понять, кто он, и определить дальнейшую логику.
#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork(); // Системный вызов fork()

    if (pid < 0) {
        // Ошибка создания процесса
        fprintf(stderr, "Fork failed!\n");
        return 1;
    } else if (pid == 0) {
        // Этот код выполняется только в ПРОЦЕССЕ-РЕБЁНКЕ
        printf("Child process: My PID is %d, parent PID is %d\n", getpid(), getppid());
    } else {
        // Этот код выполняется только в РОДИТЕЛЬСКОМ ПРОЦЕССЕ
        printf("Parent process: My PID is %d, child PID is %d\n", getpid(), pid);
    }
    return 0;
}

Ключевые особенности и важные термины

  • Копирование при записи (Copy-on-Write, COW): Современные системы для оптимизации не выполняют физическое копирование всей памяти сразу. Они используют механизм COW, где память родителя и ребёнка первоначально ссылается на одни и те же физические страницы. Копирование происходит только когда один из процессов пытается модифицировать данные в этой памяти. Это значительно экономит ресурсы при создании процессов.
  • Разделение ресурсов: После fork() некоторые ресурсы (например, открытые файловые дескрипторы) часто совместно используются. Это означает, что если родитель открыл файл, ребёнок может читать или писать в него с того же места. Однако у каждого процесса есть собственная таблица дескрипторов, и они могут закрывать или открывать файлы независимо.
  • PID и PPID: Каждый процесс имеет уникальный идентификатор (PID). Процесс-ребёнок получает новый PID, но его идентификатор родителя (PPID) становится PID родительского процесса.
  • Последовательность выполнения: После успешного fork() родитель и ребёнок выполняются независимо и параллельно. Порядок их выполнения определяется планировщиком ОС и не гарантирован.

Практическое применение fork()

Форк является фундаментом для многих операций в Linux:

  1. Создание новых программ: Традиционный способ запуска новой программы — родительский процесс делает fork(), а затем процесс-ребёнок сразу выполняет exec() для замены своего образа памяти на код новой программы (например, bash запускает команду ls).
  2. Параллельная обработка: Серверные приложения (например, веб-серверы) часто используют fork() для создания множества процессов-обработчиков, каждый из которых обслуживает отдельное подключение клиента.
  3. Реализация параллельных вычислений: Процессы, созданные через fork(), могут разделять работу для повышения производительности.

Важное отличие: Форк создаёт процесс, а не поток. Потоки (pthread_create) разделяют одно адресное пространство, а процессы после форка имеют отдельные (хотя первоначально идентичные) пространства памяти.

Таким образом, fork() — это мощный и эффективный низкоуровневый механизм ядра Linux для дублирования процессов, лежащий в основе многопроцессной модели операционной системы. Его оптимизация через Copy-on-Write и семантика возврата значений делают его центральным элементом системного программирования.

Что такое форк процесса в Linux? | PrepBro