하위 프로세스의 기본 stdin 및 stdout은 무엇입니까?

하위 프로세스의 기본 stdin 및 stdout은 무엇입니까?

하위 프로세스에 대한 기본 stdin 및 stdout이 무엇인지 알고 싶습니다(해당 기본값이 있는 경우). 하위 프로세스의 stdin 및 stdout이 상위 프로세스와 동일합니까? 이것은 부모님에게서 물려받은 것입니까, 아니면 부모님이 정해 놓은 것입니까? 아니면 하위 프로세스의 stdin 및 stdout이 상위 프로세스의 stdin 및 stdout에 삽입됩니까?

내 이해에 따르면 부모와 자식은 파이프되지 않고 먼저 복제되므로 자식의 stdin 및 stdout이 부모의 것과 정확히 동일하다고 가정하지만 확실하지 않습니다.

예를 들어 bash로그인 셸로 실행되는 터미널에서 입력하면 sh키보드용 stdin과 터미널 화면용 stdout을 갖는 하위 셸 프로세스가 생성되므로 상위 프로세스와 동일합니다. 자녀의 stdin 및 stdout이 어떻게 정의되고 무엇인지 이해하고 싶습니다.

예를 들어 이 경우에 자식의 stdin과 stdout이 부모의 표준 입력과 동일한지 알고 싶습니다. 이는 부모의 stdin이 자식의 stdin으로 파이프되고 부모는 입력을 자식에게 "리디렉션"하기 때문입니다. , 또는 아이가 키보드에서 직접 입력을 받는 경우.

같은 상황에서 부모와 자식이 동일한 표준 입력을 갖는다면 부모가 자식에게 입력한 동일한 명령을 처리한다는 의미입니까? 터미널에서 자식의 표준 입력/출력만 볼 수 있고 부모의 표준 입력/출력은 볼 수 없는 이유는 무엇입니까?

답변1

fork(2)에 대한 매뉴얼 페이지를 참조하십시오. 하위 프로세스는 표준 입력 및 표준 출력을 포함하여 상위 프로세스의 파일 설명자를 상속합니다. 단일 명령의 경우 쉘은 단순히 하위 프로세스가 이러한 설명자를 상속하고 해당 출력을 터미널에 쓰도록 허용합니다. 파이프의 경우 각 프로세스를 분기하고 한 프로세스의 출력과 다음 프로세스의 입력 사이에 파이프를 만든 다음 각 하위 프로세스의 실행 파일을 실행(exec(2))합니다.

답변2

이전 답변은 정확하지만 strace 사용에 대해 자세히 알아보시기 바랍니다. strace는 프로세스에 연결되어 해당 프로세스가 터미널에 수행하는 모든 시스템 호출을 인쇄합니다. 이는 매우 교육적일 수도 있고 약간 부담스러울 수도 있습니다. 각 시스템 호출에는 매뉴얼 페이지가 있으며 프로그램이 수행하는 모든 작은 작업에 대한 세부 정보를 볼 수 있습니다. 문제가 있는 프로세스를 디버깅하는 데 유용합니다.

관련 정보