하지만 처음으로 새 이름을 추가할 때는 새 포인터 목록을 위한 공간을 확보하기 위해 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
그것이 향상될 때 프로세스 환경의 적극적인 표현을 반영하지 않는다고 믿습니다 .