exec 명령을 실행하면 호출 셸의 환경 변수가 보존됩니까? 그렇다면 왜 그렇습니까?

exec 명령을 실행하면 호출 셸의 환경 변수가 보존됩니까? 그렇다면 왜 그렇습니까?

내가 아는 한주문 실행쉘 프로그램 호출을 다음으로 대체하십시오.주문하다하위 프로세스를 분기할 필요가 없습니다. 또한 내가 올바르게 이해했다면 내보낸 변수는 생성된 하위 항목에 전달되는 변수입니다. 하지만 왜냐하면 당신이 언제주문 실행, 명령이 호출 쉘에서 변수를 계속 상속하는 이유는 무엇입니까?

이 상황(Bash에서 실행)을 설명하기 위한 예는 다음과 같습니다.

$ cat vartest1
x=50
y=1
export y
exec ./vartest2

$ cat vartest2
echo x = $x
echo y = $y

$ ./vartest1
x =
y = 1

바테스트2내보낸 변수 상속바테스트1하지만 로컬이 아닌 경우바테스트2자식 프로세스가 아님바테스트1달릴 때구현하다?

답변1

유닉스는 스폰을 사용하지 않고 포크를 사용합니다. Fork는 일반적으로 exec 직전에 프로세스(자식 프로세스의 매우 짧은 차이점 목록 포함)를 복제합니다. (주석에서 언급했듯이 ..) exec 시스템 호출은 환경 변수가 새 프로세스에 전달되는 곳입니다. 부모는 기본적으로 새 실행 파일에 대해 자체 환경을 사용하거나 완전히 다른 것을 전달할 수 있습니다.

Bash(및 아마도 다른 쉘)에서 명령 -c의 옵션은 exec환경을 지웁니다. 환경 변수는 variable=value명령줄에서 exec 앞에 배치하여 일반적인 방법으로 변경할 수도 있습니다 . 이러한 작업 중 어느 것도 수행되지 않으면 새 실행 파일은 셸의 내용을 상속받습니다.

fork()는 하위 프로세스에서 거의 변경하지 않는 반면 exec()는 많은 변경을 수행합니다. 예를 들어, 신호 처리기가 재설정됩니다. 열린 파일 핸들은 새 실행 파일이 핸들을 얻을 수 없도록 exec에서 닫힌 것으로 표시될 수 있습니다. 메모리 매핑이 처음부터 다시 수행되었습니다. 환경 변수와 같은 것들은 세트로 상속되거나 대체될 수 있습니다.

따라서 fork와 exec가 수행하는 작업에 대한 가정은 실제 사용법과 다소 상반됩니다. 여기서의 아이디어는 새로운 프로세스를 생성하는 데 종종 fork()가 사용되며 해당 프로세스의 메모리가 모두 새로운 실행 파일로 버려지므로 변경하거나 작동하도록 설정할 필요가 없다는 것입니다. 분기 후 실행 중인 프로그램은 동일한 메모리를 계속 사용하도록 선택하거나(일반적으로 쓰기 시 복사로 설정되어 필요에 따라 메모리 페이지를 기회적으로 복제함) exec()를 사용하여 메모리를 새 프로그램으로 완전히 대체하여 자체적으로 분리할 수 있습니다. 상위 프로그램에서 공유 메모리 페이지가 연결되어 있으며 변경 사항이 없습니다. 환경 변수는 exec()를 호출한 후에 유지될 수 있는(반드시 그런 것은 아님) 몇 가지 변수 중 하나입니다.

관련 정보