Процесс порождения из многопоточного приложения

У меня есть ситуация, когда мне нужно порождать вспомогательный процесс из очень большого многопоточного приложения, над которым у меня нет полного контроля.

Щас пользуюсьfork()/exec(), Это работает много времени, но в некоторых случаях ребенок странно падает до того, какexec() случается. Я подозреваю, что это потому, чтоfork()Многопоточные приложения обычно считаются действительно плохой идеей.

Я бы очень, очень хотел бы запустить процесс атомарно, безfork()Родитель: со всеми закрытыми файловыми дескрипторами, настройкой среды, как я хочу, установкой CWD и т. д. Это должно избежать всего ужасаfork()использование моего многопоточного родительского приложения, работа с наследованием дескриптора файла и т. д.posix_spawn() должно быть идеальным. К сожалению, в Linuxposix_spawn() реализуется с помощьюfork() а такжеexec()...

vfork() определяется для приостановки родительского процесса до тех пор, пока дочерний процесс не вызоветexec(), Казалось бы, это больше похоже на то, что я хочу, но, насколько я понимаю,vfork() как правило, считается исторической реликвией в наши дни и эквивалентноfork() --- это все еще так?

Какой наименее плохой способ справиться с этим?

Обратите внимание, что:

Я не могу порождать свой процесс до того, как начнутся какие-либо потоки (потому что я не могу запустить код в этот момент)Я не могу перепроектировать свое приложение, чтобы не нуждаться в вспомогательном процессе из-за внешних требованийЯ не могу приостановить все свои потоки перед созданием вспомогательного процесса, потому что они не принадлежат мне

Это на Linux. Ява участвует, но всемой код находится в C.

Ответы на вопрос(2)

Ваш ответ на вопрос