Похоже, в моей версии glibc 2.13 есть ошибка, которая делает повторные вызовы fork()/execv() опасными, что приводит к сбою и повреждению памяти. Это происходит примерно в 1-2% случаев. Текущий поток кода выглядит следующим образом
- родитель разветвляет дочерний процесс
- дочерний элемент закрывает все унаследованные файловые дескрипторы, кроме stdin, stdout, stderr
- ребенок запускает setgid и setuid, чтобы больше не работать как root
- Бинарный файл Execv, который следует запустить
Если я заменю вышеуказанные 4 шага только использованием posix_spawn(), моя программа никогда не выйдет из строя. Кажется, это подтверждает мою гипотезу о том, что в моем текущем glibc есть ошибка с fork/execv.
Проблема с заменой шагов 1-4 на posix_spawn() заключается в том, что он не предоставляет мне механизма для выполнения шагов 2 и 3, которые чрезвычайно важны для управления ресурсами и безопасности. Есть ли какое-либо альтернативное решение или что-то, что я не учел, чтобы получить стабильную версию?