Я уверен, вы уже знаете, что system
уже использует стратегию fork/exec
. Я понимаю, что вы хотите обойти оболочку и ищете простой подход, я просто говорю, что вы могли бы так же легко написать функцию для переноса шаблона fork/exec
, как это делается в system
. На самом деле, было бы, наверное, проще всего просто сделать это. Альтернативой, упомянутой Гейбом в комментариях, является posix_spawn
.
Более быстрая (но явно обескураживающая) альтернатива — vfork()
/ exec
, но это обычно не рекомендуется и устарело в последних стандартах POSIX.
4.3BSD; POSIX.1-2001 (но помечен как УСТАРЕВШИЙ). POSIX.1-2008 удаляет спецификацию vfork().
Это должно быть сразу, за которым следует exec
или _exit
. В противном случае могут возникнуть всевозможные странные ошибки, поскольку страницы виртуальной памяти и таблицы страниц не дублируются (потомок использует одни и те же сегменты данных/кучи/стека). Родительский/вызывающий процесс блокируется до тех пор, пока дочерний процесс не достигнет exec
s или _exit
s. Современные реализации обычного fork
имеют семантику копирования при записи, которая приближается по скорости к vfork
, без потенциальных ошибок, возникающих из-за семантики совместного использования памяти vfork
.
Если вам нужен еще дальнейший контроль над семантикой совместного использования памяти и наследования процессов, а также последующее потенциальное ускорение (и в Linux), загляните на clone()
(оболочка для системного вызова sys_clone()
), которому некоторые системные вызовы, создающие процессы, делегируют свою работу. Не забудьте тщательно прочесать все различные флаги.
Вы можете использовать waitpid
, чтобы получить статус завершения процесса.
person
Jorge Israel Peña
schedule
30.03.2013
waitpid
(сWNOHANG
, если вы хотите быть асинхронным), что даст вам статус выхода после его закрытия. - person Dave   schedule 30.03.2013fork
, если вы находитесь в основной программе. И вы получаете 0, если вы находитесь в дочерней программе) - person Dave   schedule 30.03.2013spawn
: linux.die .net/man/3/posix_spawnp - person Gabe   schedule 30.03.2013fork
/execl
было бы легче читать)... - person MiJyn   schedule 30.03.2013