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

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

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

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

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

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

Обратите внимание:

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

Это в Linux. Java задействована, но весь мой код написан на C.

12
задан Shahbaz 16 November 2011 в 13:06
поделиться