[완료]pipe 관련 질문입니다.
글쓴이: longfin / 작성시간: 목, 2008/05/22 - 1:41오전
머리 싸매고 혼자 고민해봐도 잘 모르겠어서 질문글 올립니다.
int main(void){ int fd1[2]; int fd2[2]; pid_t pid[3]; int stat[3]; int i=0; pipe(fd1); //pipe(fd2); pid[0] = fork(); if(pid[0] == 0){ dup2(fd1[1],STDOUT_FILENO); close(fd1[0]); close(fd1[1]); execl("/bin/ls", "/bin/ls", NULL); perror("test:"); exit(1); } pid[1] = fork(); if(pid[1] == 0){ char buf[16]; dup2(fd1[0], STDIN_FILENO); dup2(fd1[1], STDOUT_FILENO); close(fd1[0]); close(fd1[1]); execl("/bin/grep", "/bin/grep", "Make", NULL); perror("test:"); exit(1); } pid[2] = fork(); if(pid[2] == 0){ char buf[16]; dup2(fd1[0], STDIN_FILENO); close(fd1[1]); close(fd1[0]); execl("/usr/bin/wc", "/usr/bin/wc", "-l", NULL); perror("test:"); exit(1); } for(i=0;i<3;i++){ waitpid(pid[i], &stat[i], 0); } }
ls | grep Make | wc -l을 시험해보는 코드인데 grep을 실행하는 child에서 blocking되었는지 멈춰버립니다.[pwd로 바꿔서 실행할땐 blocking되지 않는것으로 봐서 pipe의 buffer 문제가 아닐까 추측하곤 있습니다만.]
원래 이런식으로 pipe를 이어서 stdin/out을 리다이렉션하는게 아닌가요?;
Forums:
언뜻 보기에는요...
타이밍상의 문제가 발생하지 않을까요?
예를 들어서...
첫번째 fork()후 자식1이 ls를 실행하기 전에
두번째 fork()후 자식2가 grep를 실행할 가능성이라던지요.
grep이 먼저 실행되도..
ls가 실행되서 pipe에 write하기 전엔 block 되어있는 것 같습니다.;
3번째 wc를 안돌리고 ls | grep Make에서 grep의 출력을 리다이렉션 시키지 않은 상태에서 출력은 된채로 멈춰버리는 걸로 봐서요;
이렇게 하니깐 되는군요.
파이프를 두개로 했습니다.
헷갈렸네요 -.-;;
grep의 입력 -> grep 자신의 출력으로 루프도네요;;;
잘 되는군요.
정말 감사합니다.:)
댓글 달기