pipe 사용에 대해..
글쓴이: dragem / 작성시간: 토, 2004/12/04 - 9:50오후
pipe(fd); pid = fork(); if(pid == 0) { dup2(fd[1], STDOUT_FILENO); if(execlp(buff[0], buff[0], NULL) < 0) printf("1err\n"); exit(1); } else if(pid > 0) { waitpid(pid, NULL, 0); } pid = fork(); if(pid == 0) { if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) printf("error\n"); if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO) printf("error\n"); if(execlp(buff[1], buff[1], NULL) < 0) printf("2err\n"); exit(1); } else if(pid > 0) { waitpid(pid, NULL, 0); }
$ 명령1 | 명령2
을 구현하고 싶어서 저렇게 구현해봤는데 잘 안되네요..
어디서 문제가 나는걸까요.. 참고로 buff[0]과 buff[1]은 명령1과 명령2를 나타냅니다..
gdb를 통해 디버깅을 하려고 했는데.. fork한 프로세스는 따라가지 않더군요..
Forums:
waitpid(pid, NULL, 0); 일단 여기서 블럭이 될것 같네요
waitpid(pid, NULL, 0); 일단 여기서 블럭이 될것 같네요.
signal(SIGCLD, SIG_IGN); 해주서야 할것 같구요.
그리고
if(dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)
printf("error\n");
이 부분은 이상한것 같네요.
이 부분을 제외한 윗부분만으로 일단 PIPE는 될것 같은데요.
이부분의 메세지를 받는 부분을 만드셔야 할것 같구요.
한쪽에서 입력을 계속 받는 다면 루프에 빠질수도 있겠네요.
------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.
[code:1]pipe(fd);pid = fork&
블럭된다니 무슨 말이죠?
첫번째 waitpid()로 명령1을 기달린후 다 끝났으면 명령2를 실행시키려고 한것인데..
이상하게 될것 같은데 안되네요.. 그 부분을 빼고 실행해보면 첫번째 child process가 fork되서 fd[1]에 output을 넣는거 같은데요..
두번째 child에서는 fd[0]을 못 읽네요..
Re: pipe 사용에 대해..
이렇게 하면 간단히 될꺼 같은데요?
같은결과가네요^^;우후~ㅁ
같은결과가네요^^;
우후~ㅁ
제가 과제로 했던 ls | wc프로그램입니다.
도움이 되었으면 좋겠네요^^
남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.
음..원래 pipe가 parent와 child 사이에만 대화가 통하게 되
음..원래 pipe가 parent와 child 사이에만 대화가 통하게 되나요?
그림이 잘 안그려지네요... 으흠..
그런데 feelpassion님 말씀대로 하면.. 명령1|명령2 까지만 되게되네요..
명령1|명령2|명령3이어가려면 fork를 2번써야할거 같은데 으윽..
답변 해주신 feelpassion, jemiro, nthroot님 감사합니다..
waitpid() 하시면 문제가 있을텐데요.limits.h에 보시
waitpid() 하시면 문제가 있을텐데요.
limits.h에 보시면 PIPE_BUF 라고 있습니다.
pipe는 최대 PIPE_BUF 만큼만 입력할수 있고 출력에서 빠져나가면 빠져나간만큼 다시 입력할 수 있습니다.
입력pipe에서 PIPE_BUF 만큼 차버리면 비어질때까지 대기를 하게 되죠.
처음 프로세스에서 PIPE_BUF 보다 큰 사이즈를 써버리면 이 프로그램은 그대로 멈출것 같네요.
pipe는 pipe()로 생성된 p[0]과 p[1]를 공유할 수 있는곳이라면 어디서든지 사용가능합니다.
특히 부모/자식간에 pipe를 쓰는 이유는 일반적인 프로세스를 생성하는 경우 fork() 후 exe??() 함수를 사용하게 되는데..
이때 유일하게 존재하는 부모의 흔적이 fd이기 때문입니다. 나머지는 모두 자식 이미지로 대체 되구요.
------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.
댓글 달기