stdin, stdout 및 stderr(fds)은 어디에 있습니까?첫 번째열려 있는? 커널에서 만든건가요? 심볼릭 링크 /dev/std{in,out,err}는 언제 어디서 만들어졌습니까? 이를 수행하는 코드는 어디에 있습니까?
나는 그것이 리눅스 커널 소스에 있다고 가정하고 있지만, archlinux 6.5.3-arch1-1 리눅스 커널 github 저장소에서 검색한 후에도 어디서 발생하는지 찾을 수 없습니다.
편집: 이 질문에 반대표를 던졌다면 제가 더 잘할 수 있도록 이유를 설명해 주시겠습니까? 이 질문이 정말 알고 싶습니다. 답을 찾는 것은 쉽지 않습니다.
답변1
프로세스가 시작되면 운영 체제가 수행하는 작업의 일부는 프로세스의 파일 설명자를 관리하는 데이터 구조를 생성하고, 일반적인 경우 설명자 0, 1, 2를 프로세스가 제어하는 터미널 장치에 대한 포인터로 채우는 것입니다. 일부 프로세스는 터미널이 아닌 다른 장치(일반적으로 /dev/null 장치)에 연결된 파일 설명자를 사용하여 시작됩니다. 일부 프로세스는 하나 이상의 파일 설명자를 다른 프로세스(일반적으로 파이프) 또는 파일(예: "리디렉션")로 연결되는 인터페이스에 연결합니다. 상위 프로세스는 하위 프로세스를 생성하기 전에 이러한 설명자에 대한 파일/파이프를 여는 함수를 호출할 수 있지만 파일 설명자를 추적하는 데이터 구조를 관리하는 것은 여전히 커널입니다. 이런 종류의 세부 사항을 알아야 한다면 Unix/Linux 내부에 관한 책을 참조하세요.
각 프로세스에는 고유한 별도의 파일 설명자 목록이 있으므로 특정 날짜/시간에 생성되었다고 가리키고 말할 수 있는 보편적인 설명자 또는 장치 파일 집합이 없습니다. 프로세스의 디스크립터는 해당 프로세스가 시작될 때 생성되며, 새로운 프로세스가 많이 시작되므로 항상 파일 디스크립터가 생성됩니다. (프로세스가 종료되고 운영 체제가 정리되면 삭제됩니다.)
/dev/stdin, /dev/stdout 및 /dev/stderr에 대해 문의합니다. 이는 물리적 장치가 아닌 가상 장치(종종 "논리적" 장치라고 함)입니다. 프로세스 ID 하면ls -l /dev/stdin
보면사용와 같은 명령을 두 번째 터미널의 셸에서 호출된 다른 프로세스 ID를 가리키고 링크가 특정 위치에 생성된 것을 볼 수 있습니다. time . 그러나 디렉터리와 파일은 실제로 관리 프로세스를 둘러싼 커널 데이터 구조를 보는 디렉터리 집합을 가리킵니다. 이러한 데이터 구조는 프로세스별로 다른 값(예: 프로세스 ID)을 갖습니다. 프로세스가 시작되고 종료되고 새 섹션이 생성되고 삭제됩니다./proc/self/fd/0
/proc/self
ls
/proc/self
ls
/dev/stdin
/dev/stdout
/dev/stderr
나는 귀하의 질문에 반대표를 던지지 않지만, 제 생각에는 이 단순해 보이는 질문이 실제로 정확하게 대답하려면 많은 내부 지식이 필요하다는 것입니다. 이는 커널 소스 코드에서는 명확하지 않습니다. 그래서 나는 당신이 그것을 탐구하는 데 도움이 되도록 내부 작동에 관한 책을 구입한다고 언급했습니다. 이러한 유형의 Q&A 포럼에는 제한 사항이 있으며 운영 체제 내부에 대한 확장된 튜토리얼 스타일 답변은 여기에 적합하지 않습니다.
답변2
아니요, 커널은 상관하지 않습니다. main()에 들어가기 전에 초기 부팅 사용자 공간 코드에서 열립니다.