에서 https://unix.stackexchange.com/a/436631/674
파일은
/proc/$$/environ
... 환경에 대한 변경 사항을 반영하지 않고exec
프로세스 에서 프로그램을 실행할 때 수신 한 내용 만보고합니다.
APUE에서 :
각 프로그램에는 환경 목록도 전달됩니다. 인수 목록과 마찬가지로 환경 목록은 각 포인터가 널로 끝나는 C 문자열의 주소를 포함하는 문자 포인터의 배열입니다. 포인터 배열의 주소는 전역 변수에 포함됩니다
environ
.extern char **environ;
특정 환경 변수에 대한 액세스는 일반적으로 environ 변수 대신 섹션 7.9에 설명 된
getenv
및putenv
함수를 통해 이루어집니다. 그러나 전체 환경을 통과하려면environ
포인터를 사용해야합니다.
인가 /proc/$$/environ
및 전역 변수 environ
서로 서로 또는 일관성 독립적?
를 통해 액세스 한 문자열 environ
도 환경에 대한 변경 사항을 반영하지 않고에서받은 환경 만보고 execve()
합니까?
아니면을 통해 액세스되는 문자열 environ
이 getenv
항상 최신 환경 문자열을 얻는 것처럼 항상 변경 사항을 반영 합니까?
를 통해 액세스 한 문자열 getenv
이 항상 변경 사항을 반영하고 항상 최신 상태입니까?
감사.
/proc/$$/environ
변수 environ
는 독립적입니다. environ
환경에 대한 변경 사항을 반영하며 실제로를 통해 environ
환경 변수가 환경에 추가 될 때 포인터의 값 도 변경됩니다 putenv()
(이는 구현 세부 사항입니다).
시스템 호출 수준과 라이브러리 수준을 구분해야합니다. 시스템 호출 수준에서 환경과 관련된 유일한 메커니즘 envp
은 execve
호출에 대한 인수 입니다. 이 매개 변수는 name=value
새 프로그램의 환경을 구성하는 쌍 을 포함 할 것으로 예상됩니다 . 이 환경은 사용자 공간 시작 코드가 선택할 수있는 새 프로세스의 스택에 복사됩니다.
도서관 수준에서 우리는
environ
환경의 사본을 가리키는 전역 변수getenv()
및 putenv()
환경 조사 및 수정exec*
기능 (inlcuding하지 않는 가족 execve
암시 적 (경유) environ
) 또는 명시 적 (매개 변수를 통해 전달) 접속 환경exec*
라이브러리 함수는 궁극적으로 호출 execve
시스템 호출을. 변수는 스택에 환경 가리 키지 않는; 대신 변수가 설정 되기 전에 환경이 프로세스 힙에 복사 됩니다 (이는 다시 구현 세부 사항입니다). environ
environ
/proc/$$/environ
환경 변화를 반영 하지 않는 이유는 무엇 입니까? /proc/$$/environ
커널이 제공하는 가상 파일이며 커널은 사용자 프로세스의 주소 공간에서이 낮은 수준에서 무슨 일이 일어나고 있는지 알 수있는 방법이 없습니다. 커널은 environ
변수에 대한 지식이 없으며 프로세스가 환경을 저장하는 데 사용하는 데이터 구조를 인식하지 못합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다