전체 사용자 스택을 이동하지 않고 putenv () / setenv ()는 어떻게 작동합니까?
여기에서 여러 게시물을 읽었으며 setenv()
작동 방식 에 대해 여전히 혼란 스럽습니다 .
- linux-where-are-environment-variables-stored
- 환경 문자열 실제 저장 위치
- 어떻게-내-프로그램-내-자신 -setenv
내 이해는 환경 변수가 사용자 스택의 맨 아래에 지속적으로 "foo = bar \ 0"문자열로 저장되고, envp[]
이 문자열을 가리키는 포인터 배열 이 있으며 또한 맨 아래에 가깝다는 것입니다. 사용자 스택. 사용자 스택은 이러한 바이트 위로 증가하므로 문자열 영역이나 포인터 배열에 더 많은 항목을 추가하는 것이 중요하지 않습니다. 따라서 setenv()
새 변수가 설정 envp[]
되거나 (에 요소를 추가해야 함 ) 변수가 변경되었지만 새 값 문자열이 이전 값보다 길면 (거의) 신규 사용자를위한 공간을 만들기위한 전체 사용자 스택?
다소 관련된 질문은 bash
로컬로 설정된 변수의 내부 목록을 유지하고 사용자 export
가 로컬로 설정된 변수를 bash
로컬로 관리되는 목록에서 제거하고 위에서 언급 한 스택 문자열 영역의 맨 아래에 추가하고 포인터를 삽입하는 것입니다. 포인터 배열 envp[]
, 자식 프로세스가 내 보낸 변수를 자동으로 상속하도록?
답변
내 이해는 환경 변수가 다음과 같이 저장된다는 것입니다.
귀하의 이해는 부분적으로 만 정확합니다. :미소:
... 새로운 사용자를위한 공간을 만들기 위해 전체 사용자 스택을 (거의) 이동하지 않고?
그것은 불가능합니다. 프로그램이 작성된 언어가 C인지 운영 체제가 UNIX인지에 관계없이. 예를 들어, 스택의 포인터가 스택의 다른 위치를 참조 할 수 있기 때문입니다.
가장 먼저 주목할 점은 환경 변수가 새 프로세스에 저장되는 위치는 아키텍처에 따라 다르다는 것입니다. 대부분의 CPU 아키텍처에서 대부분의 UNIX 구현은 설명한대로 스택에 저장합니다. 그러나 C 사양에는 그 솔루션을 요구하는 문자 그대로 아무것도 없습니다. 또한 환경을 수정하면 기존 환경 변수 블록을 메모리의 새 위치에 자유롭게 복사 할 수 있습니다. C 구현은 환경 변수 블록을 자유롭게 이동하고 매직 변수를 업데이트 할 수 __environ
있습니다.
다소 관련된 질문은 bash가 로컬로 설정된 변수의 내부 목록을 유지합니까? ...
당신이 설명하는 방식이 아닙니다. 로컬로 설정된 변수의 "내부 목록"을 유지합니다. 그러나 그것은 당신이 제안한 방식을 사용하지 않습니다.
이 문제를 열게 된 계기가 궁금합니다.