fork()
создает дочерний процесс, дублируя вызывающий процесс. Процесс, который вызвал fork()
, является родительским процессом , а недавно созданный процесс является дочерним процессом . Таким образом, fork()
разделяет процесс на две части и возвращает 0
дочернему процессу и PID
дочернего процесса родительскому процессу, или -1
, если не удалось получить ответвление.
Дочерний и родительский процессы выполняются в разных пространствах памяти. Во время fork()
оба пространства памяти имеют одинаковое содержимое.
Когда вы вызываете exec()
из процесса, он запускает исполняемый файл в контексте уже существующего процесса, заменяя предыдущий исполняемый файл. Новая программа загружается в то же адресное пространство процесса. Текущий процесс просто превращен в новый процесс и, следовательно, PID
не изменился, это потому, что мы не создаем новый процесс, мы просто заменяем процесс другим процессом в exec.
Существует концепция, называемая Copy-on-Write, хорошо знать об этом -
Копирование при записи - это оптимизация, при которой таблицы страниц настраиваются так, что родительский и дочерний процессы начинают совместно использовать одну и ту же память, и при необходимости копируются только те страницы, которые записаны любым процессом.
Если процесс не изменяет какую-либо память и немедленно выполняет новый процесс, полностью заменяя адресное пространство. Таким образом, было бы расточительно копировать всю память процесса во время разветвления, и вместо этого используется метод копирования при записи.