에서 인용위키피디아:
기본적으로 프로세스가 생성되면 상위 프로세스의 복제 환경을 상속받습니다.자식을 만들 때 부모가 명시적으로 변경한 것 외에도. 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는 다음을 가리킨다.exec
C
다른 프로세스를 실행하는 데 사용되는 함수 계열입니다.
프로세스가 다른 프로세스를 시작하는 일반적인 순서는 다음과 같습니다.fork
, 방금 생성한 하위 항목에서 exec
함수 중 하나를 호출합니다.
및 사이에서 fork
하위 exec
프로세스에서는 대상 실행 파일이 시작되기 전에 환경이 변경될 수 있습니다.
또한 호출 프로세스 execle
가 execvpe
대상 환경으로 직접 전달되도록 허용합니다.
execle
및 가 사용 되지 않고 execvpe
하위 호출 fork
과 exec
하위 호출 사이에 환경이 수정되지 않으면 일반 규칙이 적용됩니다.
쉘 예제는 쉘 하위의 환경을 변경하는 방법을 보여주기 위해 설계되었습니다. 위에서 언급한 "트릭" 중 일부를 사용하지 않고는 쉘에서 이 작업을 수행할 수 없습니다. 모든 하위 프로세스는 현재 쉘 환경의 정확한 복사본을 얻게 됩니다.