내 데스크탑에는 다양한 프로그램에 대한 실행 프로그램이 여러 개 있는데, 이러한 실행 프로그램에는 "터미널에서 실행" 설정이 있습니다.
해당 설정을 확인하면 프로그램이 터미널에서 실행되고 거기에 출력이 기록됩니다. stdin
터미널에서도 읽을 수 있다고 생각합니다 .
그러나 프로그램이 터미널에서 실행되지 않으면 IO는 어떻게 되나요?또, 이런 프로그램에서 시스템(쉘) 명령을 실행하면 어떻게 될까요?
이러한 프로그램을 실행하는 "백그라운드" 쉘이 있습니까? 아니면 각 프로그램마다 시스템의 나머지 부분과 상호 작용하는 자체 쉘이 있습니까?
답변1
프로그램이 시작되면(일련의 시스템 호출 중 하나를 통해) exec(3)
환경(즉, 쉘 변수 ed)을 상속하고 부모로부터 파일을 엽니다. export
프로그램을 시작할 때 수행하는 작업은 fork(2)
서브루틴이 환경과 파일을 설정한 다음 exec(3)
새 프로그램을 만드는 것입니다. 쉘이 이 작업을 수행하면 STDIN, STDOUT 및 STDERR이 터미널에 연결됩니다. 그래픽 런처의 역할은 그래픽 런처에 따라 다르지만 무엇에 연결해야 합니까 /dev/null
(키보드 입력은 어디서 오고 출력은 어디로 가야 합니까?)
위와 같이 시작된 프로그램이 순차적으로 호출되면 exec(3)
위와 같습니다. 명령줄 구문 분석 등을 수행하기 위해 쉘을 생성하고 해당 쉘이 명령을 실행하기 system(3)
때문에 약간 복잡합니다 . exec(3)
그러나 메커니즘은 동일합니다. 즉, 파일이 상속되고 환경도 상속됩니다.