Да, потому что именно так это делается в UNIX.
Системный вызов «запустить приложение» отсутствует; это всегда выполняется парами fork / exec.
Между прочим, exec
не генерирует новый PID. exec
заменяет содержимое процесса - память удаляется и загружается совершенно новый исполняемый файл, но состояние ядра остается прежним (открытые файлы, переменные среды, рабочий каталог, пользователь и т. д.), а PID остается прежним.
Дальнейшее чтение, если вам интересно:
vfork
похож на fork
, за исключением того, что он должен всегда сочетаться с exec
, и полезно, когда fork
не может работать, как в ucLinux.
clone
- это новый fork
(сегодняшняя функция fork
использует clone
за кулисами), но делает гораздо больше, включая создание новых процессов, которые совместно используют одну и ту же память (а не дублируют ее, как fork
), и мы вызываем эти потоки.
Это поведение rsync
по умолчанию.
Пример
## Preamble
$ cd /tmp
$ mkdir src dst stuff
$ touch stuff/{a,b,c}
$ ( cd src && ln -s /tmp/stuff dir1 )
$ ( cd dst && ln -s /tmp/stuff dir1 )
## Symlinks are retained
$ cd /tmp
$ rsync -avv src/ dst/
## Change scenario
$ ls -l src
$ rm src/dir1 && cp -a /tmp/stuff src/dir1
## Symlinks are replaced according to the source
$ cd /tmp
$ rsync -avv src/ dst/
$ ls -l dst