В UNIX новый процесс запускается системным вызовом exec
.
Не совсем. fork
или clone
создают новый процесс. exec
заменит текущую запущенную программу другой программой внутри существующего процесса.
Но мне интересно, почему бы просто не установить начальные состояния и не перейти к новому процессу прямо в exe c function?
Это будет означать, что вы хотите полностью эмулировать exec()
на уровне пользователя (используя open()
, read()
et c.) вместо использования ядра .
Во многих случаях это теоретически возможно. Однако в некоторых случаях это невозможно. (Подумайте о файле с -rws--x--x
правами доступа!)
И для этого потребуется, чтобы весь интерпретатор формата файла был в функции exec()
на уровне пользователя. Особенно при использовании статически связанных исполняемых файлов каждая программа, вызывающая exec()
, должна содержать код, который анализирует формат исполняемых файлов.
В этом случае разные программы могут поддерживать разные форматы файлов: Некоторые программы, написанные для Linux ядер 1.2.13 сможет запускать оба (недавно представленные) ELF и a.out исполняемые файлы, в то время как другие смогут запускать только a.out файлы; не все программы могут быть запущены всеми программами.
Реализация ядра (с использованием системного вызова) будет поддерживать или не поддерживать определенный тип файла независимо от программы, которая вызывает exec()
.
Следующая проблема состоит в том, что реализация на уровне пользователя может «забыть» некоторый код деинициализации: допустим, вы используете реализацию exec()
, написанную для Linux 2.4, и вызываете системный вызов timer_create()
. Поскольку реализация exec()
не знает о существовании таких таймеров, она не остановит таймер.
Реализация ядра (с использованием системного вызова) знает все функции операционной системы и, следовательно, очищает "старые" программа »полностью перед запуском новой.