내 프로그램에 환경에 대한 참조가 없을 때 getenv(3)와 같은 함수가 어떻게 환경에 액세스할 수 있습니까?
답변1
귀하의 프로그램에는 환경에 대한 참조가 없지만 전체복사그것은.
명령줄 인수와 환경 문자열(시스템 execve(2)
호출에 전달될 때)은 함께 압축되어 프로세스의 주소 공간에 복사됩니다[1].
일반적인 구현[2]에서는 다음으로 끝나는 두 개의 포인터 목록 ( NULL
매개변수 목록과 환경을 나타냄 )_start
main()
char **environ
전역 변수를 후자의 시작 부분으로 이동합니다.
이 getenv(3)
함수는 단순히 목록을 살펴보고 environ
각 항목을 차례로 비교합니다.
일부 새 항목을 환경에 추가해야 하는 경우(예: setenv(3)
) environ
목록은 다른 곳으로 재배치됩니다.
[1] Linux에서 매개변수 목록 및 환경 변수의 주소는 필드 48 및 50으로 액세스할 수 있습니다 . /proc/PID/stat
을 참조하세요 .procfs(5)
[2] glibc에서는_start
스택의 맨 위를 argc
가리키며 팝업됩니다 .argv
__libc_start_main
__environ
(의 별칭 environ
)을 로 설정 합니다 argv + argc + 1
.