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