Почему ветвление механизма создания процесса по умолчанию?

Две легких программы просмотра изображений, которые предлагают этот вид простой функциональности и все еще имеют настраиваемые или scriptable интерфейсы, являются feh и sxiv.

47
07.02.2012, 21:13
2 ответа

Это должно упростить интерфейс. Альтернатива fork и exec было бы что-то как функция CreateProcess Windows. Заметьте сколько параметров CreateProcess имеет, и многие из них являются структурами еще с большим количеством параметров. Это вызвано тем, что все, чем Вы могли бы хотеть управлять о новом процессе, должно быть передано CreateProcess.Действительно, CreateProcess не имеет достаточного количества параметров, таким образом, Microsoft должна была добавить CreateProcessAsUser и CreateProcessWithLogonW.

С fork/exec модель, Вам не нужны все те параметры. Вместо этого определенные атрибуты процесса сохраняются через exec. Это позволяет Вам fork, затем измените любые атрибуты процесса, которые Вы хотите (использование тех же функций, которые Вы обычно использовали бы), и затем exec. В Linux, fork не имеет никаких параметров, и execve имеет только 3: программа для выполнения, командная строка для предоставления его и ее среды. (Существуют другие exec функции, но они - просто обертки вокруг execve если библиотекой C для упрощения случаев общего использования.)

Если Вы хотите запустить процесс с другого текущего каталога: fork, chdir, exec.

Если Вы хотите перенаправить stdin/stdout: fork, близкие/открытые файлы, exec.

Если Вы хотите переключить пользователей: fork, setuid, exec.

Все эти вещи могут быть объединены по мере необходимости. Если кто-то придумывает новый вид атрибута процесса, Вы не должны изменяться fork и exec.

Как larsks упомянутый, самый современный Unixes используют копию на записи, таким образом, fork не включает значительные издержки.

58
27.01.2020, 19:34
  • 1
    Превосходное объяснение. "Те, кто не понимает UNIX, осуждены переосмыслить его, плохо". - Henry Spencer –  Kyle Jones 07.02.2012, 21:57
  • 2
    Спасибо! у Вас есть ссылка, случайно? –  Ellen Spertus 07.02.2012, 22:07
  • 3
    @Aki, нет, CreateProcess () буквально делают новый процесс и создают его с нуля, никакое разветвление. –  psusi 08.02.2012, 01:19
  • 4
    Но разве некоторый эквивалент CreateProcess не должен там быть () где-нибудь в Unix? Иначе, как самый первый процесс становится созданным? В отличие от мифологического бога создателя, первый процесс не может разветвиться () сам от небытия. ;-) –  Steven Monday 08.02.2012, 05:54
  • 5
    @StevenMonday, да, но это находится в коде инициализации ядра и не внешне доступно. Не требуются все те параметры, потому что почти все - hardcoded. Это может только создать идентификатор 1 процесса, иначе процесс init. После этого процессы создаются только путем разветвления. –  cjm 09.02.2012, 01:18

В дополнении к ответу cjm Единственная Спецификация Unix определяет названную функцию vfork(). Та функция работает как ветвление, за исключением того, что разветвленный процесс имеет неопределенное поведение, если это делает что-нибудь кроме попытки, вызывающей функцию семейства должностных лиц или вызов _exit().

Таким образом в значительной степени единственное использование с определенным поведением:

pid_t ret = vfork();
if(ret == 0)
{
    exec(...);
    _exit(EXIT_FAILURE); //in case exec failed for any reason.
}

Таким образом, что делает vfork ? Это, недорогое fork. В implemenations без копии на записи получающийся процесс совместно использует пространство памяти с исходным процессом (следовательно неопределенное поведение). В реализациях с копией на записи, vfork разрешен быть идентичным fork(), так как реализации копии на записи быстры.

Существует также дополнительное posix_spawn функция (и a posix_spawnp функция), который может непосредственно создать новый процесс. (Также допустимо реализовать их с использованием вызова библиотеки fork и exec, и реализация в качестве примера обеспечивается.)

5
27.01.2020, 19:34

Теги

Похожие вопросы