C 라이브러리는 환경 변수에 어떻게 액세스합니까?

C 라이브러리는 환경 변수에 어떻게 액세스합니까?

내 프로그램에 환경에 대한 참조가 없을 때 getenv(3)와 같은 함수가 어떻게 환경에 액세스할 수 있습니까?

답변1

귀하의 프로그램에는 환경에 대한 참조가 없지만 전체복사그것은.

명령줄 인수와 환경 문자열(시스템 execve(2)호출에 전달될 때)은 함께 압축되어 프로세스의 주소 공간에 복사됩니다[1].

일반적인 구현[2]에서는 다음으로 끝나는 두 개의 포인터 목록 ( NULL매개변수 목록과 환경을 나타냄 )_startmain()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.

관련 정보