-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Redirection 구현하면서 고민한 부분입니다.
일단, redirection의 실행 예를 보여드리면,
$ sort < words1.txt > words2.txt >> words3.txt -r
위 예제는
words1.txt 를 stdin으로
words2.txt 를 stdout으로
words3.txt 를 stdout으로 설정하게 됩니다.
> 와 >> 의 차이는 append 하느냐의 차이입니다.
redirection을 위와 같이 설정한 후 자식 프로세스는 sort 명령어를 수행합니다.
그리고 redirection의 위치는 자유로운 것 같습니다.
$ sort -r < words1.txt > words2.txt >> words3.txt
$ sort < words1.txt > words2.txt >> words3.txt -r
위 두 명령은 같습니다.
또한, redirection은 순서에 영향을 받습니다.
첫 번째 예에서 > words2.txt 보다 >> words3.txt가 나중에 있어서 결과적으로 stdout은 words3.txt 파일에 연결되어 words3.txt에만 sort의 결과가 저장됩니다.
기존에 제가 파싱에 요구한 것은 "pipe 또는 redirection 기호가 나오면, cmd를 분리하자"고 말씀드렸으나 redirection 기능을 구체화하면서 다음의 내용으로 수정해야 겠다고 생각했습니다.
- redirection으로 cmd를 분리하는 것이 아니라 pipe로만 cmd를 분리한다.
- <, <<, >, >> 기호 다음에 나오는 파일명이 저장되어야 한다. ->
t_redir 구조체 - t_redir에 저장된 정보를 통해 FD(file description) 설정을 진행한 후 exec() 함수를 통해 프로세스를 실행한다. 이 때, 프로세스는 자식 프로세스!
- redirection에 주어지는 인자들은 exec()으로 명령어가 실행될 때의 argv로 전달되지 않으므로, redirection과 관련된 인자들(위 예제에서 < words1.txt > words2.txt >> words3.txt)는 argv에 저장되면 안 된다. 즉, argv에는 sort -r 이 저장된다. -> 파싱 단계에서 진행하는 것이 이상적이라 생각함
일단은 기본적인 redirection 기능에만 초점을 맞추었습니다.
예를 들어 $ wc 0< infile 1> outfile와 같이 redirection 기호 왼쪽에 fd를 작성하는 기능은 아직 생각하지 않았습니다.
참고 파일인 set_redirection.c push 하겠습니다.