[minishell] 6. 리다이렉션(Redirection) 처리
파이프와의 차이점은, 표준입력과 표준출력을 넘겨주는(변경하는) 대상이 프로세스가 아니라 파일(file)이라는 것 뿐이다.
리다이렉션 처리를 이해하려면 앞의 글 파이프 처리에서 정리했던
dup2
함수에 대한 이해가 필요합니다.
1. 리다이렉션 기호
command > file
: 표준출력을 파일에 덮어쓰거나(overwrite) 파일이 없다면 새로 생성함dup2(fd, 1)
command < file
: 파일의 데이터를 명령어의 표준입력(input)으로 넘김dup2(fd, 0)
command >> file
: 표준출력을 파일에 개행문자 후 덧붙이거나(append) 파일이 없다면 새로 생성함
2. 리다이렉션 핵심
파이프에서 배웠던 dup2(fd1, fd2)
함수가 리다이렉션에서에서도 중요하다. 파이프와의 차이점은, 표준입력과 표준출력을 넘겨주는 대상이 프로세스가 아니라 파일(file)이라는 것 뿐이다.
2.1. 리다이렉션을 구현하는 입장에서 고려하면 좋은 사실들
리다이렉션 기호를 기준으로 항상 오른쪽에 파일이, 왼쪽에 명령어가 온다. (명령어는 생략 가능)
표준입력, 출력은 항상 파일을 기준으로 생각하기!
가끔 파일에 입력하는게 출력인지 입력인지 헷갈릴 때가 있는데 받은 입력을 파일에 출력하는 것이기 때문에 표준출력을 파일에 넘겨줘야 한다.
command > file 이면 dup(fd, 1)
3. 파이프와 리다이렉션이 같이 있는 경우
3.1. 이해를 위해 직접 참고해보면 좋을 케이스들
전부 bash 기준입니다.
터미널 에는 pwd 출력
a.txt 에는 hi 입력
터미널 에는 pwd 출력
a.txt 에는 rw-r--r-- 1 daelee staff 26 2 2 11:13 Makefile 입력
터미널 에는 아무것도 출력되지 않음
123456 에는 hi 입력
세번째 케이스를 bash에 테스트해보니 확실히 이해된 것 같다. 리다이렉션의 결과를 (파이프로 연결된) 다음 프로세스로 넘겨줄 필요가 없다.
파이프는 앞에있는 프로세스의 표준출력을 뒷 프로세스의 표준입력으로 넘겨주는건데, 리다이렉션을 써버리면 표준출력을 리다이렉션이 지정한 파일로 해버리니까 넘겨줄 값 자체가 없는 것이다.
구현하는 관점에서, 그렇다고 이 케이스에서 파이프가 끊긴다고 생각할 필요는 없을 것 같다. 그냥 "표준출력으로 출력할 게 없고 표준입력으로 넘겨받을 게 없다, 넘겨받은 값이 0이다." 라고 생각하고 파이프라인은 계속 유지시키면 될 것 같다.
Last updated