전역 변수`environ`을 통해 액세스 할 수있는 문자열이 환경에 대한 변경 사항을 반영하지 않습니까?

에서 https://unix.stackexchange.com/a/436631/674

파일은 /proc/$$/environ... 환경에 대한 변경 사항을 반영하지 않고 exec프로세스 에서 프로그램을 실행할 때 수신 한 내용 만보고합니다.

APUE에서 :

각 프로그램에는 환경 목록도 전달됩니다. 인수 목록과 마찬가지로 환경 목록은 각 포인터가 널로 끝나는 C 문자열의 주소를 포함하는 문자 포인터의 배열입니다. 포인터 배열의 주소는 전역 변수에 포함됩니다 environ.

extern char **environ;

특정 환경 변수에 대한 액세스는 일반적으로 environ 변수 대신 섹션 7.9에 설명 된 getenvputenv함수를 통해 이루어집니다. 그러나 전체 환경을 통과하려면 environ포인터를 사용해야합니다.

인가 /proc/$$/environ및 전역 변수 environ서로 서로 또는 일관성 독립적?

를 통해 액세스 한 문자열 environ도 환경에 대한 변경 사항을 반영하지 않고에서받은 ​​환경 만보고 execve()합니까?

아니면을 통해 액세스되는 문자열 environgetenv항상 최신 환경 문자열을 얻는 것처럼 항상 변경 사항을 반영 합니까?

를 통해 액세스 한 문자열 getenv이 항상 변경 사항을 반영하고 항상 최신 상태입니까?

감사.

요한 미레 엔

/proc/$$/environ변수 environ는 독립적입니다. environ환경에 대한 변경 사항을 반영하며 실제로를 통해 environ환경 변수가 환경에 추가 될 때 포인터의 값 도 변경됩니다 putenv()(이는 구현 세부 사항입니다).

시스템 호출 수준과 라이브러리 수준을 구분해야합니다. 시스템 호출 수준에서 환경과 관련된 유일한 메커니즘 envpexecve호출에 대한 인수 입니다. 이 매개 변수는 name=value새 프로그램의 환경을 구성하는 쌍 을 포함 할 것으로 예상됩니다 . 이 환경은 사용자 공간 시작 코드가 선택할 수있는 새 프로세스의 스택에 복사됩니다.

도서관 수준에서 우리는

  • environ환경의 사본을 가리키는 전역 변수
  • 기능 getenv()putenv()환경 조사 및 수정
  • exec*기능 (inlcuding하지 않는 가족 execve암시 적 (경유) environ) 또는 명시 적 (매개 변수를 통해 전달) 접속 환경

exec*라이브러리 함수는 궁극적으로 호출 execve시스템 호출을. 변수는 스택에 환경 가리 키지 않는; 대신 변수가 설정 되기 전에 환경이 프로세스 힙에 복사 됩니다 (이는 다시 구현 세부 사항입니다). environ environ

/proc/$$/environ환경 변화를 반영 하지 않는 이유는 무엇 입니까? /proc/$$/environ커널이 제공하는 가상 파일이며 커널은 사용자 프로세스의 주소 공간에서이 낮은 수준에서 무슨 일이 일어나고 있는지 알 수있는 방법이 없습니다. 커널은 environ변수에 대한 지식이 없으며 프로세스가 환경을 저장하는 데 사용하는 데이터 구조를 인식하지 못합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관