Вызова fork()
достаточно. Это также более гибко; он позволяет вам настраивать перенаправление ввода / вывода в дочернем процессе, а не усложнять системный вызов для создания процесса. С программами SUID или SGID это позволяет ребенку потерять свои повышенные привилегии перед выполнением другого процесса.
Если вам нужен сложный способ создания процесса, найдите функцию posix_spawn()
.
#include <spawn.h>
int posix_spawn(pid_t *restrict pid, const char *restrict path,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char *const envp[restrict]);
int posix_spawnp(pid_t *restrict pid, const char *restrict file,
const posix_spawn_file_actions_t *file_actions,
const posix_spawnattr_t *restrict attrp,
char *const argv[restrict], char *const envp[restrict]);
Разница в том, что posix_spawnp()
выполняет поиск по PATH для исполняемого файла.
Существует целый ряд других функций для обработки типов posix_spawn_file_actions_t
и posix_spawnattr_t
(перейдите по ссылкам «См. Также» внизу справочной страницы, на которую ссылаются).
Это немного больше похоже на CreateProcess()
в Windows. По большей части, однако, использование fork()
, за которым вскоре следует exec()
, проще.
Я не понимаю, что вы имеете в виду. Код дочернего процесса будет написан мной, так в чем же разница между написанием if (fork() == 0)
и размещением этого кода в начале дочернего main()
?
Очень часто код, который вы выполняете, не написан вами, поэтому вы не можете изменить то, что происходит в начале дочернего процесса. Подумайте о раковине; если единственными программами, которые вы запускаете из оболочки, являются те, которые вы написали, жизнь будет очень бедной.
Довольно часто исполняемый код будет вызываться из разных мест. В частности, представьте себе оболочку и программу, которые иногда выполняются в конвейере, а иногда без конвейеров. Вызываемая программа не может сказать, какие перенаправления ввода-вывода и исправления она должна делать; вызывающая программа знает.
Если вызывающая программа запущена с повышенными привилегиями (привилегии SUID или SGID), то обычно требуется отключить эти функции перед запуском другой программы. Полагаться на другую программу, чтобы знать, что делать ... глупо.