Sobes.tech
Junior — Middle
74

Какое различие между системными вызовами fork() и vfork() в Linux и в каких ситуациях их используют?

Компании, где спрашивали
Магнит Тех

Ответ от нейросети

sobes.tech AI

fork() создает новый процесс (ребенка), который является копией родительского процесса с отдельным адресным пространством. После вызова fork() родитель и ребенок работают независимо, изменения в памяти не влияют друг на друга.

vfork() тоже создает новый процесс, но не копирует адресное пространство родителя. Вместо этого ребенок использует память родителя до тех пор, пока не вызовет exec() или _exit(). Это ускоряет создание процесса, но накладывает ограничения: ребенок не должен изменять память или возвращаться из функции, вызвавшей vfork(), иначе поведение неопределено.

Используют fork(), когда нужно создать независимый процесс с копией памяти. vfork() применяют для оптимизации, когда сразу после создания процесса вызывается exec(), и нет необходимости в копировании памяти — это снижает накладные расходы.

Пример использования vfork():

pid_t pid = vfork();
if (pid == 0) {
    // ребенок сразу заменяет образ процесса
    execlp("ls", "ls", NULL);
    _exit(1); // если exec не сработал
}
// родитель продолжает работу