Исключение наследования переменных среды

Сродни ответу @andcoz, если Вы не знаете PID приложения (я принимаю, Вы не знаете это прочь наизусть), попробуйте это:

kill -HUP `pidof [application_name]`
5
01.08.2011, 13:10
2 ответа

В модели Unix, запуская другую программу включает два primivites:

  • fork() создает (почти) идентичную копию обработки вызовов. Новый процесс называют дочерним процессом, и исходный процесс называют родительским процессом. Дочерний процесс выполняет тот же код как оригинал, имеет те же полномочия, имеет ту же среду и получает копию изменяемой памяти данных родительского процесса. Самое видимое различие между двумя процессами - то, что у них есть различные идентификаторы процесса, и различные идентификаторы родительского процесса (PPID ребенка является PID родителя).
  • execve() заменяет код и данные текущего процесса кодом и данные, загруженные из исполняемого файла. Этот системный вызов берет новую среду процесса как аргумент.

Большинство высокоуровневых функций, созданных вокруг fork() и execve() передайте текущую среду процесса execve(). Таким образом, если процесс не изменяет свою собственную среду или вызовы execve() непосредственно, названная программа наследует среду программы вызова.

Оболочки обычно передают свою среду программам, которые они называют. Можно изменить среду оболочки в любое время путем присвоения значения переменной среды (foo="some value"; необходимо звонить export foo если переменная уже не находится в среде), или удалите переменную из среды путем сбрасывания ее (unset foo). Если Вы хотите запустить внешнюю программу с переменными различной или новой среды, существует синтаксис ярлыка:

foo="some value" mycommand

примерно эквивалентно

(foo="some value"; export foo; exec mycommand)

(где круглые скобки ограничивают объем установки foo).

10
27.01.2020, 20:34
  • 1
    Спасибо! (1) Среда может быть изменена при вызове execve ()? Действительно ли это более трудно, чем выполнение прежде execve () и после ветвления ()? (2) foo="some value" mycommand не работает. Как там предполагается, a; прежде mycommand? –  StackExchange for All 07.08.2011, 03:52

API относятся к exec семейство C функции, которые используются для выполнения другого процесса.

Типичная последовательность для одного процесса для запуска другого является первой к fork, затем в ребенке просто создал, назовите один из exec функции.

Промежуточный fork и exec, в дочернем процессе может быть изменена среда, прежде чем целевой исполняемый файл запускается.

execle и execvpe также позвольте обработке вызовов передавать в целевой среде непосредственно.

Если execle и execvpe не используются, и среда не изменяется между вызовами к fork и exec в ребенке применяется нормальное правило.

Примеры оболочки предназначены, чтобы показать Вам, как можно изменить среду для ребенка оболочки. Если бы оболочка не использовала некоторые вышеупомянутые "приемы", то она не могла бы позволить Вам сделать это - все дочерние процессы получили бы точную копию среды Вашей текущей оболочки.

2
27.01.2020, 20:34

Теги

Похожие вопросы