환경 변수 상속의 예외

환경 변수 상속의 예외

에서 인용위키피디아:

기본적으로 프로세스가 생성되면 상위 프로세스의 복제 환경을 상속받습니다.자식을 만들 때 부모가 명시적으로 변경한 것 외에도. API 수준에서 이러한 변경은 포크와 실행 사이에 수행되어야 합니다. 또는 bash와 같은 셸에서 env를 간접적으로 호출하거나 ENVIRONMENT_VARIABLE=VALUE 표기법을 사용하여 특정 명령 호출에 대한 환경 변수를 변경할 수 있습니다.

나는 "프로세스가 생성되면 상위 프로세스의 중복 환경을 상속받습니다"를 이해합니다. 하지만 "자식을 생성할 때 부모가 명시적으로 변경한 사항"이라는 예외가 실제로 무엇을 의미하는지 알고 싶습니다. API와 셸의 예가 어떻게 예외의 예가 될 수 있는지 이해가 되지 않습니다.

답변1

UNIX 모델에서 다른 프로그램을 시작하려면 두 가지 기본 요소가 필요합니다.

  • fork()호출 프로세스의 (거의) 동일한 복사본을 만듭니다. 새 프로세스를 하위 프로세스라고 하고 원래 프로세스를 상위 프로세스라고 합니다. 하위 프로세스는 원래 프로세스와 동일한 코드를 실행하고, 동일한 권한을 갖고, 동일한 환경을 가지며, 상위 프로세스의 가변 데이터 메모리 사본을 받습니다. 두 프로세스의 가장 분명한 차이점은 프로세스 ID와 상위 프로세스 ID가 다르다는 것입니다(하위 프로세스의 PPID는 상위 프로세스의 PID입니다).
  • execve()현재 프로세스의 코드와 데이터를 실행 파일에서 로드된 코드와 데이터로 바꿉니다. 이 시스템 호출은 프로세스의 새로운 환경을 매개변수로 사용합니다.

대부분의 고급 기능은 프로세스의 현재 환경을 중심으로 구축되어 fork()전달됩니다. 따라서 프로세스가 자체 환경을 변경하거나 직접 호출하지 않는 한 호출된 프로그램은 호출 프로그램의 환경을 상속합니다.execve()execve()execve()

쉘은 일반적으로 자신이 호출하는 프로그램에 환경을 전달합니다. 환경 변수에 값을 할당하여 언제든지 쉘의 환경을 변경할 수 있습니다( foo="some value"; 변수가 환경에 없는 경우 호출해야 함 export foo). 설정을 해제하여 환경에서 변수를 제거할 수 있습니다( unset foo). 다른 환경 변수나 추가 환경 변수를 사용하여 외부 프로그램을 시작하려면 바로 가기 구문을 사용할 수 있습니다.

foo="some value" mycommand

대략 동등하다

(foo="some value"; export foo; exec mycommand)

(괄호는 설정 범위를 제한합니다 foo.)

답변2

API는 다음을 가리킨다.execC다른 프로세스를 실행하는 데 사용되는 함수 계열입니다.

프로세스가 다른 프로세스를 시작하는 일반적인 순서는 다음과 같습니다.fork, 방금 생성한 하위 항목에서 exec함수 중 하나를 호출합니다.

및 사이에서 fork하위 exec프로세스에서는 대상 실행 파일이 시작되기 전에 환경이 변경될 수 있습니다.

또한 호출 프로세스 execleexecvpe대상 환경으로 직접 전달되도록 허용합니다.

execle및 가 사용 되지 않고 execvpe하위 호출 forkexec하위 호출 사이에 환경이 수정되지 않으면 일반 규칙이 적용됩니다.

쉘 예제는 쉘 하위의 환경을 변경하는 방법을 보여주기 위해 설계되었습니다. 위에서 언급한 "트릭" 중 일부를 사용하지 않고는 쉘에서 이 작업을 수행할 수 없습니다. 모든 하위 프로세스는 현재 쉘 환경의 정확한 복사본을 얻게 됩니다.

관련 정보