Linux에서 소위 "표준 스트림"은 stdin, stdout 및 stderr입니다. 이를 "표준"이라고 부르는 데에는 이유가 있습니다. 비표준 스트림이 있습니까? 커널은 이러한 비표준 스트림을 근본적으로 다르게 처리합니까?
답변1
이 경우 "스트림"은 프로세스에서 열린 파일입니다. ("스트림"이라는 단어는 이 기사와 관련되지 않은 다른 의미를 가질 수 있습니다.)
이 세 가지 표준 스트림은 프로그램이 시작될 때 이미 열려 있어야 하는 스트림입니다. 파일 설명자 0은 프로그램이 사용자 입력이나 기본 데이터 입력을 읽어야 하는 곳이기 때문에 표준 입력이라고 합니다. 파일 설명자 1은 프로그램이 일반 데이터 출력을 거기에 기록해야 하기 때문에 표준 출력이라고 합니다. 파일 설명자 2는 프로그램이 거기에 오류 메시지를 기록해야 하기 때문에 표준 오류라고 합니다.
다른 파일 설명자 번호에는 사전 할당된 역할이 없기 때문에 표준이 아닙니다. 그것들은 결국 프로그램이 원하는 어떤 목적으로든 사용될 것입니다. 따라서 프로그램에 의해 열린 모든 파일은 "비표준 스트림"이라고 불릴 수 있지만 이는 이상하고 혼란스러울 수 있습니다. "stdin, stdout 또는 stderr 이외의 파일 열기"에는 실제로 이름이 필요하지 않지만 " 비표준 스트림" "특수한 유형의 파일이나 비표준 방법을 통해 열리는 파일이 있는 것 같지만 사실이 아닙니다.
파일 설명자 0-2의 일반적인 역할은 표준 라이브러리와 일부 프로그램에 의해 부여됩니다. 예를 들어, 콘솔 로그인 프로그램과 터미널 에뮬레이터는 셸(또는 다른 프로그램)을 시작하고 이러한 파일 설명자에서 터미널을 엽니다. C 표준 라이브러리는 FILE*
이러한 세 가지 표준 설명자에 대한 개체(C에서는 이를 스트림이라고 함)를 생성합니다. 커널에는 특별한 처리가 없습니다.
답변2
커널은 모든 파일 설명자를 동일한 방식으로 처리합니다. 입력(stdin)에 파일 설명자 0을 사용하고, 출력(stdout)에 파일 설명자 1을 사용하고, 파일 설명자 2(stderr)에 오류를 인쇄하는 것은 프로세스에 대한 관례일 뿐입니다.
터미널이 시작되면 의사 tty가 생성되고 파일 설명자 0, 1, 2에 할당된 입력/출력으로 셸이 시작됩니다. 그런 다음 프로그램이 이 규칙을 사용하지 않는 경우 입력 및/또는 출력을 적절하게 리디렉션해야 합니다.