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