파이프 라인과 리다이렉션 구현 질문입니다...
제가 쉘을 짜고 있는데요..
처음엔 숙제로 시작했는데...이제 다양한 구현을 하고 싶어서요..
지금은 단순히 패스 환경변수를 찾아서 패스들로 이루어진 배열을 만들었구요
커맨드 라인에서 명령을 입력받은 뒤에 각 명령들을 나누어서 배열에 저장하구요..
그리고 fork()해서 자식 프로세스로 명령어 인자값을 넘긴다음에..
그렇게 구현했거든요...저는 execv로 해서 자식프로세스를 실행시켰습니다..
(처음에 구현 조건이었거든요...--;)
이렇게 하다 보니...background jop 이라든지 sequential 하게 돌아가게끔..
또 pipe, >, <, >> 이런 기능을 구현하고 싶어요...
대충 파이프의 사용법도 알구요...대충 어떤식으로 돌아가는 지는 알겠는데..
지금 제가 짠 소스를 유지하면서 구현을 하려니깐 막막하네요...
저는 main()에서 자식프로세스를 실행시켰거든요...
위와 같은 구현을 하려면 따로 프로세스를 생성시키는 함수를 만들어야 겠죠?
진짜 궁금한 건요...한 command line에 여러개의 파이프와 리다이렉션 또는 background job으로 이루어지게끔 명령을 입력했다면...
여기서는 어떻게 해야되는 건지요..
제가 위에서도 말씀드렸지만...commad line을 읽어와서 배열에 넣는 부분에서 각각이 파이프인지 리다이렉션인지를 검사해서 일일이 프로세스를 실행시켜줘야 하나요?
또 execv를 사용했으니깐...파이프 이후에는 다시 처음부터 배열을 생성시켜야 될 것 같은데...
너무 주절주절 거렸나요? ^^;
정말~~~~~~~~~~궁금합니다.~~~~~~~~~
방향만 좀 일러주시면 안될까요? 고수님들의 명쾌한 답변 부탁드립니다..
일단 commandline parsing은 알아서(-_-) 하시리라 믿고
일단 commandline parsing은 알아서(-_-) 하시리라 믿고요.
보통 fork() 후에 자식 프로세스는 exec..를 하고, 부모 프로세스는 wait를 합니다. 그런데 부모 프로세스가 wait를 하지 않고 제 할 일을 하면? 바로 이게 background job이죠.
prog > outfile
이건 자식 프로세스 쪽에서 exec..를 부르기 전에 close(1); open("outfile", "w"); 순으로 불러주면 됩니다. >>는 "w" 대신에 "a"로 불러줘야겠죠? <는 연습문제.
pipe는 좀 더 복잡합니다. pipe()란 시스템 함수와 dup()란 시스템 함수를 이용하면 됩니다. 이곳에 설명하는 것보다는 시스템 프로그래밍 책을 살펴보세요.
@ KLDP는 숙제를 대신 해 주는 곳이 아닙니다. :(
댓글 달기