리디렉션은 운영 체제 커널이 아닌 셸의 개념입니까?
시스템 호출 리디렉션은 어떻게 구현됩니까?
리디렉션 구현이 파이프와 유사합니까?
답변1
리디렉션의 경우 stdin(< 입력을 통한 입력) 및 stdout(> 출력을 통한 출력)을 대체하기 위해 dup2()를 사용하는 쉘에서 이(리디렉션)가 달성된다고 가정합니다.
- 입력 및 출력을 위해 파일 열기 in = open() out = open()
- dup2(in, 0) // 입력 파일을 표준 입력으로 교체
- dup2(out, 1) // 출력 파일을 stdout으로 교체합니다.
- 근사)
- 닫다(아웃)
- 구현하다()
파이프의 경우, Pipe(2) 시스템 호출은 비슷한 방식으로 사용됩니다. 즉, 읽기 끝과 쓰기 끝이 있습니다. 파이프를 통해 연결된 각 명령은 파이프의 한쪽 끝에서 읽고 다른 쪽 끝으로 씁니다. stdin, stdout은 명령의 해당 파이프 끝을 대체합니다.
답변2
"리디렉션"은 쉘 개념으로, 세부 사항은 말하는 쉘에 따라 다릅니다.
그러나 리디렉션의 기본은 시작 시 미리 열리는 입력 및 출력 파일 설명자 개념에 있으며, 이는 함수 작동 방식으로 돌아갑니다 execve
. 즉, 하위 프로세스는 열린 파일 설명자를 상속합니다.
따라서 자식 프로세스(명령)를 시작하려면 부모 프로세스(즉, 셸)는 먼저 자식 프로세스에 대한 자식 프로세스를 만든 다음 자식에 대한 적절한 파이프 끝(파일 설명자 0, 1 및 2)을 설정합니다. 프로세스' 입력 및 출력을 선택한 다음 하위 프로세스가 실행을 통과할 때 이를 상속하도록 합니다 execve
.
예, 파이프라인입니다.