Что означает " ребенок наследует среду родителя "? Наследует, копируя всю среду, или наследует, получая указатель на ту же среду (каким-либо образом)?
Вот мой сценарий:
- У меня запущен процесс
P
со своей собственной средой (переменными)
- В какой-то момент
P
выполняет fork
- В
0
-клоне if-statement
(то есть в дочернем процессе C
), execv
выполняется
- Оба процесса продолжают работать независимо.
Итак, в какой-то момент приложение перестает работать нормально. И причина тому - «сломанная» среда.
Интересно, что обе среды изменились .. Когда я запускаю родительский процесс и выполняю
$ cat /proc/PID/environ
как для родителя, так и для процесса, все в порядке. Через несколько часов приложение перестает работать, и когда я снова выполняю приведенную выше строку (для проверки среды), обе изменяются, и многие переменные среды отсутствуют - присутствуют только стандартные (например, PWD
, HOME
). , USER
и т. Д.).
Как это возможно? А где может быть проблема - у ребенка или у родителя?
РЕДАКТИРОВАТЬ: Спасибо всем за ответы, +1 от меня, так как они все были правильными (@caf, @Saphrosit и @R ..). Причина этой проблемы действительно глупая ..
Все переменные окружения были помещены в /etc/profile
, который выполняется ПОСЛЕ ВХОДА (что .. я не знал).
Ну, оказалось, что проблема произошла при перезапуске машины. Итак, при запуске приложение запускается снова, но /etc/profile/
означает , а не выполнено / прочитано. И это вызывает плохое поведение. И вот почему проблема исчезает при ручном перезапуске - после входа в систему root
(через ssh
) считываются переменные среды из /etc/profiles
, а когда родительский процесс перезапускается (root
), это все хорошо - переменные окружения наследуются.
Глупая ошибка.