환경 문자열은 실제로 어디에 저장됩니까?

환경 문자열은 실제로 어디에 저장됩니까?

하지만 처음으로 새 이름을 추가할 때는 새 포인터 목록을 위한 공간을 확보하기 위해 malloc을 호출해야 합니다. 이전 환경 목록을 이 새 영역에 복사하고 포인터 목록 끝에 이름=값 문자열에 대한 포인터를 저장합니다. 그러나 이 목록에 있는 대부분의 포인터는 여전히 스택 상단 위에 있는 name=value 문자열을 가리킵니다(예: UNIX 환경의 고급 프로그래밍). 대기열에 새로 생성된 환경 목록이나 문자열이 있는 것 같습니다.

답변1

환경 변수는 스택 위의 프로세스 메모리 레이아웃 상단에 명령줄 인수와 함께 저장됩니다.

여기에 이미지 설명을 입력하세요.

답변2

환경(이름/값 쌍)은 스택의 맨 위에 있습니다. 그림 2 및 섹션 3Linux/i386 ELF 바이너리의 부팅 상태환경이 어디에 있는지 보여줍니다. 문서가 약간 오래되었기 때문에ELF 보조 벡터스택에도 존재합니다.

작은 C 프로그램을 사용하여 이를 확인할 수 있습니다.

#include <stdio.h>
int main(int argc, char **argv, char **env)
{
        printf("argv holds %p\n", argv);
        printf("argv[0] holds %p\n", argv[0]);
        printf("env holds %p\n", env);
        printf("env[0] holds %p\n", env[0]);
        return 0;
}

이것은 또 다른 유사한 질문에 대답하지 않습니다. export SOME_VAR셸에서 작업을 수행할 때 셸은 새 환경 변수를 어디에 저장합니까? 쉘은 자신의 환경을 마음대로 확장할 수 있는 데이터 구조로 저장해야 하며, 이는 시스템 호출 envp의 (세 번째) 인수 로 사용됩니다(배열로 변환) execve(2).

답변3

환경 변수는 사용 중인 셸을 나타냅니다. 저는 전체 환경을 프로세스를 구성하는 빌딩 블록의 일부인 데이터 구조로 생각합니다.

나는 모든 프로세스에 걸쳐 단일 위치에 함께 저장되는 것을 원하지 않으며 오히려 각 프로세스는 주어진 프로세스 및 주어진 프로세스와 관련된 기타 정보로 환경 변수를 저장할 가능성이 더 높습니다.

/proc커널에서 실행되는 프로세스에 대한 정보를 유지하는 파일 시스템을 보면 이를 알 수 있습니다 .

bash내 프로세스 중 하나를 조회하면 다음과 같습니다 .

$ ps -eaf| grep bash | tail -1
saml     12095  3211  0 May10 pts/53   00:00:04 bash

이 프로세스 /proc영역 보기(상위 5개 나열):

$ sudo cat /proc/12095/environ | tr '\0' '\n' | head -5
rvm_log_path=/home/saml/.rvm/log
rvm_ruby_string=ruby-1.9.2-p180
TERM=xterm
SHLVL=1
KDEDIRS=/usr

이는 적어도 프로세스가 시작될 때의 초기 환경을 보여줍니다. 나는 /proc/PID/environ그것이 향상될 때 프로세스 환경의 적극적인 표현을 반영하지 않는다고 믿습니다 .

관련 정보