Bash에서 실행되는 새 프로세스는 어떻게 항상 동일한 환경 변수를 가질 수 있습니까?

Bash에서 실행되는 새 프로세스는 어떻게 항상 동일한 환경 변수를 가질 수 있습니까?

얼마 전 나는 간단한 C 프로그램의 ELF 바이너리를 탐색하기 위해 GDB를 사용하고 있었습니다. printenv터미널에서 실행할 때 인쇄된 환경 변수가 해당 터미널에서 실행하는 C 프로그램 바이너리의 스택 상단에도 나타나는 것을 확인했습니다 .

Bash는 실제로 어떻게 프로그램을 실행하고 동시에 모든 환경 변수를 새 프로세스의 스택에 추가합니까? 간단히 말해서, 다음과 같은 프로그램을 실행할 때 단계별로 어떤 일이 발생합니까? ./myprogram

답변1

Linux 프로그램은 execve시스템 호출을 통해 실행됩니다. execve다음과 같은 서명이 있습니다.

int execve(const char *filename, char *const argv[], char *const envp[]);

마지막 매개변수 envp는 환경을 문자열 배열로 프로세스에 전달하는 데 사용되며, 각 문자열은 키=값 형식입니다. 관례적으로, 호출 프로세스가 환경을 일부 변경하지 않는 한 동일한 환경은 한 프로세스에서 다른 프로세스로 전달됩니다. 커널은 프로그램 인수를 전달하는 것처럼 새 프로그램이 스택의 환경을 수신하도록 준비합니다.

라이브러리 함수 execl, execlpexecvexecvp매개변수를 사용하지 않습니다 envp(그러나 execleexecvpe함수는 매개변수를 사용함). 이러한 함수는 environ호출 프로세스의 전역 변수에서 환경을 가져옵니다. 이렇게 하면 함수를 사용하여 execle다른 프로그램을 시작하는 프로그램은 환경 전달에 대해 걱정할 필요가 없지만 라이브러리 함수는 자동으로 "배후에서" 이를 수행합니다.

언급된 모든 라이브러리 함수는 궁극적으로 execve시스템 호출을 호출하여 매개변수에 환경을 전달합니다 envp.

관련 정보