pipe와 fifo에 관한 질문입니다.
글쓴이: hmd7932 / 작성시간: 금, 2014/04/04 - 10:36오전
네트워크 프로그래밍 공부 중 질문이 있어 고수님들께 질문 올립니다.
프로세스간의 통신 방법 중 Pipe 부분을 공부하고 있습니다.
여기 설명으로는 ps -aux | grep httpd | wc -l를 예로 들면서
ps의 표준 출력을 grep의 표준 입력으로, grep의 표준출력을 wc의 표준 입력으로 연결한다라고 되어있고
Pipe는 부모 자식 프로세스 간에만 통신이 가능하다고 하고 fifo를 통해서 다른 프로세스간의 통신을 한다라고 되어있습니다.
ps -aux | grep httpd | wc -l에서 ps, grep, wc는 /bin에 있는 서로 다른 프로그램을 실행시킨 프로세스 들인데
위 명령어를 치면 리눅스 운영체제에서 ps를 부모로 하고 exec 함수를 통해 grep이라는 자식을, grep은 exec를 통해 wc를 실행시킨 구조로 되어있다는건가요?
근데 또 그럼 이해가 안가는게 exec 함수라면 ps만 실행되고 끝나버릴텐데 말이죠...
말이 잘 정리가 안되는데, 요점은 리눅스에서 "|"연산자는 fifo로 동작하는 것인지, 아니면 pipe로 동작하는 것인지입니다.
감사합니다.
Forums:
이거 수정이 안되네요
추가를 하려고 했는데 수정을 어떻게 하는지 몰라서...
ps -aux | grep httpd | wc -l 과 같이 했을 때
제 추측
-bash 에서 명령어 파싱 후 fifo를 생성, ps의 표준 출력을 grep의 표준 입력으로, grep의 표준 출력을 wc의 표준 입력으로 연결
맞나요? 어렵네요 ㅜㅜ
이런 식으로 하면 됩니다.
fifo를 쓸 필요는 없습니다. (다음은 하나의 예시일 뿐이고 꼭 이 순서대로 동작할 거라는 얘기는 아닙니다.)
ps -aux | grep httpd | wc -l 이라면,
(1) shell이 fork. 원래 프로세스는 그냥 하던 일 계속 하고 자식 프로세스가 아래의 작업 진행.
(2) pipe 1 생성
(3) 한번 더 fork
(3-1) 자신이 부모 프로세스이면 pipe 1의 쓰기 fd를 닫고 읽기 fd를 stdin에 연결한 뒤 exec "wc -l" 실행
(3-2) 자신이 자식 프로세스이면 다시 아래의 작업 진행
(4) pipe 1의 읽기 fd를 닫고 쓰기 fd를 stdout에 연결
(5) pipe 2 생성
(6) 또 한번 fork
(7-1) 자신이 부모 프로세스이면 pipe 2의 쓰기 fd를 닫고 읽기 fd를 stdin에 연결한 뒤 (stdout은 이미 pipe 1에 연결되어 있음) exec "grep httpd" 실행
(7-2) 자신이 자식 프로세스이면... 뭐 할지 알겠죠?
댓글 달기