전역 환경 변수와 fork() 및 exec()에 대한 질문

전역 환경 변수와 fork() 및 exec()에 대한 질문

내가 이해하고 싶은 것은 상위 프로세스가 내보낸 변수를 하위 프로세스가 상속받는 위치입니다.

내가 알고 싶은 것은 내보낸 환경 변수를 하위 프로세스가 상속하는 위치입니다. exec() 시스템 호출이 fork()에 의해 생성된 환경 변수를 덮어쓴다는 것을 이해합니다...그러나 모든 환경 변수가 재정의되면 exec()는 어떻게 내보낸 환경 변수가 새로 생성된 하위 프로세스에 포함되도록 합니까? 내 추측으로는 내보낸 환경 변수가 어떻게든 재정의 대상에서 제외된다는 것입니다. 하지만 이를 확인할 수는 없습니다.

편집하다내 요구 사항을 더 명확하게 표현하기 위해 질문을 편집했습니다.

답변1

전역 환경 변수가 없습니다. 그들은 부모로부터 자녀에게 전달됩니다.

  • fork환경 변수는 변경되지 않습니다.
  • exece사후 수정은 환경 변수를 변경하지 않습니다 .
  • exec수정 후 e덮어쓰기 환경 변수.

환경을 변경하기 위해 e후행 s를 사용하는 것 외에도 다음을 수행할 수도 있습니다.exec

int pid = fork() //new process with same environment variables
if (pid == 0) {
    putenv   //add some environment variables
    unsetenv //remove some environment variables
    exec     //replace program. non e version of exec.
} …

답변2

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

--사람들은 처형한다

envp매개변수는 다음을 제공합니다.모두프로그램 실행을 위한 환경변수입니다. 에 값을 전달하지 않으면 envp실행 프로그램은 환경 변수를 전혀 볼 수 없습니다.

환경 변수( )를 읽을 때 getenv()항상 현재 프로세스에서 읽습니다.

시스템 전체 환경 변수를 설정할 수 없습니다. 하위 프로세스에 전달할 변수를 설정하여 초기 프로세스의 환경만 구성할 수 있습니다.

알겠어요가능한완전히 다른 환경에서 다른 프로그램을 시작하세요. 그러나 가장 널리 사용되고 일반적인 규칙은 자신의 환경 복사본을 사용하여 프로그램을 시작하는 것입니다. 필요한 경우 특정 환경 변수를 수정할 수 있습니다.

한 가지 예외는 환경을 완전히 재설정하는 su --login및 입니다. 이러한 명령에 대한 옵션을 sudo --login ...생략하면 --login일부 환경 변수가 전달될 수 있으며 때로는 "예기치 않은 결과"가 발생할 수 있습니다.

관련 정보