fork()
, а затем exec()
является стандартным решением.
Используйте fork()
(или vfork()
) для запуска отдельного процесса, который будет клоном родительского.И в дочернем, и в родительском процессе выполнение продолжается, но fork
возвращает другое значение в любом случае, позволяя вам различать.Затем вы можете использовать exec()
из дочернего процесса.
Заметьте, однако, из одной из моих публикаций в блоге (http://davmac.wordpress.com/2008/11/25/forkexec-is-forked-up/):
Кажется, что нетлюбой простой, совместимый со стандартами способ (или даже вообще переносимый способ) параллельно выполнять другой процесс и быть уверенным, что вызов exec () был успешным. Проблема в том, что после того, как вы выполните fork () d, а затем успешно выполните exec ()Если вы не можете связаться с родительским процессом, чтобы сообщить, что exec () был успешным. Если exec () не работает, то вы можете связаться с родителем (через сигнал, например), но вы не можете сообщить об успехе -Единственный способ, которым родитель может быть уверен в успехе exec (), - это дождаться () завершения дочернего процесса (и проверить, что нет индикации сбоев), и это, конечно, не параллельное выполнение.
Потенциальное решение этой проблемы, в случае, если это проблема в вашем случае:
[...] используйте pipe () для создания канала, установите выходной конец близкоon-exec, затем fork ()(или vfork ()), exec () и что-то записать (возможно, errno) в канал, если exec () завершится неудачно (до вызова _exit ()).Родительский процесс может читать из канала и получит немедленный конец ввода, если exec () завершится успешно, или некоторые данные, если exec () завершился неудачей.
(Обратите внимание, что это решение с помощьюсклонен вызывать инверсию приоритета, если дочерний процесс выполняется с более низким приоритетом, чем родительский).
Существует также posix_spawn
, как упомянуто в других ответах, но он несколько менее переносим (недоступен в старых системахв частности) и не решает вышеуказанную проблему, поскольку она все равно часто реализуется в терминах fork / exec и может вернуть успех до сбоя этапа exec()
.