У меня ситуация, когда мне нужно создать вспомогательный процесс из очень большого многопоточного приложения, над которым у меня нет полного контроля.
Сейчас я использую fork ()
/ exec ()
. В большинстве случаев это срабатывает, но в некоторых случаях дочерний элемент неожиданно вылетает до того, как произойдет exec ()
. Я подозреваю, что это потому, что использование fork ()
многопоточных приложений обычно считается действительно плохой идеей.
Мне бы очень, очень понравился способ запускать процесс атомарно, без fork ()
в родительском элементе: все файловые дескрипторы закрыты, среда настроена так, как я хочу, установлен CWD и т. Д. Это должно избежать всех ужасов, связанных с fork ()
моим многопоточным родительским приложением, а также работой с наследованием файловых дескрипторов и т. Д. posix_spawn ()
должен быть идеальным. К сожалению, в Linux posix_spawn ()
реализован с использованием fork ()
и exec ()
...
vfork ()
определен чтобы приостановить родительский процесс до тех пор, пока дочерний процесс не вызовет exec ()
.Казалось бы, это больше похоже на то, что я хочу, но я понял, что vfork ()
в наши дни обычно считается исторической реликвией и эквивалентен fork ()
--- это это все еще так?
Какой наименее плохой способ справиться с этим?
Обратите внимание:
Это в Linux. Java задействована, но весь мой код написан на C.