Как не передавать переменные среды команде дочернего процесса? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь понять спецификации проекта кодирования C с использованием fork () и execv ().

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

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

Вся эта идея для меня новая информация, поэтому я просто пытаюсь понять, что именно это означает.

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

Но если это так тогда переменные окружения всегда передаются от родителя / оболочки, верно? Так в чем же разница, и как бы мне не распространять эти переменные?

Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вы все еще контролируете ситуацию после fork() и до execv().

. Вы можете вносить изменения в среду своего ребенка, которые не хотите делать родителям, включая звонки. в unsetenv() - в этом процессе.

Кроме того, вы можете полностью создать новую среду и передать ее в аргументе envp в execve().

0 голосов
/ 07 марта 2020

Если вы поняли fork(2), тогда вы будете знать, что родитель и потомок в точности совпадают (за исключением значения, возвращаемого fork()), поэтому среда родительского процесса точно такая же, как среда ребенка. нет другого способа передать окружение дочернему процессу ... потому что execve(2) не создает новый процесс . Вы загружаете только виртуальное пространство процесса, загружая в него новую программу. И это позволяет вам изменять среду, как это происходит со списком аргументов. Представьте себе argc и argv как способ передачи позиционных параметров программе, а среду как способ передачи именованных параметров программе. Обе вещи абсолютно одинаковые, но одни ищут по позиции, в то время как к другим обращаются по имени.

Но новый процесс не создается в execve(2) (ни в одном из его вариантов)

...