Sobes.tech
Junior — Middle

Ποια είναι η διαφορά μεταξύ των συστημικών κλήσεων fork() και vfork() στο Linux και σε ποιες καταστάσεις χρησιμοποιούνται;

sobes.tech AI

Απάντηση από 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 не сработал
}
// родитель продолжает работу