Может ли дочерний процесс влиять на среду родительского процесса? - PullRequest
2 голосов
/ 20 февраля 2012

Что означает " ребенок наследует среду родителя "? Наследует, копируя всю среду, или наследует, получая указатель на ту же среду (каким-либо образом)?


Вот мой сценарий:

  1. У меня запущен процесс P со своей собственной средой (переменными)
  2. В какой-то момент P выполняет fork
  3. В 0 -клоне if-statement (то есть в дочернем процессе C), execv выполняется
  4. Оба процесса продолжают работать независимо.

Итак, в какой-то момент приложение перестает работать нормально. И причина тому - «сломанная» среда.

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

$ cat /proc/PID/environ

как для родителя, так и для процесса, все в порядке. Через несколько часов приложение перестает работать, и когда я снова выполняю приведенную выше строку (для проверки среды), обе изменяются, и многие переменные среды отсутствуют - присутствуют только стандартные (например, PWD, HOME). , USER и т. Д.).

Как это возможно? А где может быть проблема - у ребенка или у родителя?


РЕДАКТИРОВАТЬ: Спасибо всем за ответы, +1 от меня, так как они все были правильными (@caf, @Saphrosit и @R ..). Причина этой проблемы действительно глупая ..

Все переменные окружения были помещены в /etc/profile, который выполняется ПОСЛЕ ВХОДА (что .. я не знал).

Ну, оказалось, что проблема произошла при перезапуске машины. Итак, при запуске приложение запускается снова, но /etc/profile/ означает , а не выполнено / прочитано. И это вызывает плохое поведение. И вот почему проблема исчезает при ручном перезапуске - после входа в систему root (через ssh) считываются переменные среды из /etc/profiles, а когда родительский процесс перезапускается (root), это все хорошо - переменные окружения наследуются.

Глупая ошибка.

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Ребенок наследует копию среды родителя на момент fork(). Последующие изменения среды в одном процессе не влияют на другой.

Единственный способ изменить это - сделать что-то очень странное, например, поместить окружение в область MAP_SHARED или использовать ptrace(). Вы бы знали это, если бы сделали что-то подобное.

2 голосов
/ 20 февраля 2012

... или в обоих?

Ребенок начинается с дубликата своего родительского окружения, поэтому не может повлиять на его родительское окружение.Поэтому я не думаю, что ребенок изменил окружение отца, но, возможно, отец изменил свое собственное.

Не зная, что именно делает программа, очень сложно сказать, в чем проблема ...

1 голос
/ 20 февраля 2012

На этот вопрос почти невозможно ответить без более подробной информации, но я все равно собираюсь ответить на него?

Вы уверены, что содержимое окружения действительно действительно в тот момент, когда вы звоните fork? Конечно, возможно, что вы испортили память, но родительский объект уже получил и кэшировал копии переменных, которые ему нужны на данный момент, и это только позже сломается, когда он попытается повторно получить одну. Если это так, то и в ребенке должно быть нарушено окружение, но ребенку может быть все равно ...

Если это не проблема, похоже, что единственная возможность, оставшаяся в работающей системе, это то, что либо родитель перезапускается, а вы не знаете об этом, либо родитель повредил свою собственную среду после fork ing.

В противном случае, возможно, у вас есть раздел подкачки на сломанном устройстве, и среда заменяется и портится, когда она возвращается обратно ...?

...