전체 사용자 스택을 이동하지 않고 putenv () / setenv ()는 어떻게 작동합니까?

Aug 20 2020

여기에서 여러 게시물을 읽었으며 setenv()작동 방식 에 대해 여전히 혼란 스럽습니다 .

  • linux-where-are-environment-variables-stored
  • 환경 문자열 실제 저장 위치
  • 어떻게-내-프로그램-내-자신 -setenv

내 이해는 환경 변수가 사용자 스택의 맨 아래에 지속적으로 "foo = bar \ 0"문자열로 저장되고, envp[]이 문자열을 가리키는 포인터 배열 이 있으며 또한 맨 아래에 가깝다는 것입니다. 사용자 스택. 사용자 스택은 이러한 바이트 위로 증가하므로 문자열 영역이나 포인터 배열에 더 많은 항목을 추가하는 것이 중요하지 않습니다. 따라서 setenv()새 변수가 설정 envp[]되거나 (에 요소를 추가해야 함 ) 변수가 변경되었지만 새 값 문자열이 이전 값보다 길면 (거의) 신규 사용자를위한 공간을 만들기위한 전체 사용자 스택?

다소 관련된 질문은 bash로컬로 설정된 변수의 내부 목록을 유지하고 사용자 export가 로컬로 설정된 변수를 bash로컬로 관리되는 목록에서 제거하고 위에서 언급 한 스택 문자열 영역의 맨 아래에 추가하고 포인터를 삽입하는 것입니다. 포인터 배열 envp[], 자식 프로세스가 내 보낸 변수를 자동으로 상속하도록?

답변

KurtisRader Aug 20 2020 at 12:35

내 이해는 환경 변수가 다음과 같이 저장된다는 것입니다.

귀하의 이해는 부분적으로 만 정확합니다. :미소:

... 새로운 사용자를위한 공간을 만들기 위해 전체 사용자 스택을 (거의) 이동하지 않고?

그것은 불가능합니다. 프로그램이 작성된 언어가 C인지 운영 체제가 UNIX인지에 관계없이. 예를 들어, 스택의 포인터가 스택의 다른 위치를 참조 할 수 있기 때문입니다.

가장 먼저 주목할 점은 환경 변수가 새 프로세스에 저장되는 위치는 아키텍처에 따라 다르다는 것입니다. 대부분의 CPU 아키텍처에서 대부분의 UNIX 구현은 설명한대로 스택에 저장합니다. 그러나 C 사양에는 그 솔루션을 요구하는 문자 그대로 아무것도 없습니다. 또한 환경을 수정하면 기존 환경 변수 블록을 메모리의 새 위치에 자유롭게 복사 할 수 있습니다. C 구현은 환경 변수 블록을 자유롭게 이동하고 매직 변수를 업데이트 할 수 __environ있습니다.

다소 관련된 질문은 bash가 로컬로 설정된 변수의 내부 목록을 유지합니까? ...

당신이 설명하는 방식이 아닙니다. 로컬로 설정된 변수의 "내부 목록"을 유지합니다. 그러나 그것은 당신이 제안한 방식을 사용하지 않습니다.

이 문제를 열게 된 계기가 궁금합니다.