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