pipe와 fork관련 기초수준의 질문입니다.(코딩중 에러)
일단 테스트를 위해 두 부분을 주석처리 하였습니다.
(// 로 된 세줄이 하나이고, /* */ 로 묶인 부분이 또 하나입니다.
이 두 부분을 다 풀고 첫번째 //주석 윗부분의 else {를 지워주면
원본 소스입니다.)
아래 붙인 코드 내용중 주석 처리된 밑의 else if문이 원본이나,
임시로 else { 로 바꾸어 보면 여기까지는 실행이 정상적으로 됩니다.
그런데 이것을 else if로 바꾸면 블럭 안으로 들어가 지는 것은 같은데
정상적인 실행이 안되네요...
(원본 소스를 돌린 결과가
testing one testing two testing three
라고 각 블럭내의 printf문이 출력 되기에 들어가 진다는 것을 알았습니다.)
more 라는 글자가 좌측 하단에 뜨고, 엔터를 누를때마다 스크롤 되야 정상
인데 more라는 글자도 좌측 하단에 안뜨고 엔터를 치면 그냥 프롬프트가
다시 뜨는군요.
물론 위에서 적은대로 원본 소스를 돌리면
testing one
testing two
testing three
세개만 나오고, 강제종료 시키지 않으면
엔터를 칠때마다 프롬프트 없이 개행만 계속 이루어 집니다.
제가 아는 지식 한에서는 제대로 짠 것 같은데 원인을 알수가 없네요..
무엇보다 else if 와 else 둘다 블럭내로 들어가 지는데
else 의 경우는 실행이 되고 else if의 경우는 실행이 안되는 이유를
모르겠습니다. 원 프로세스와 부 프로세스의 차이일까요
지금 막 유닉스에서 테스트를 해 보았는데요
유닉스 에서는 잘 돌아 가네요 ㅡㅡ;;;
그리고 유닉스에서는
execlp의 more와 sort만 바꾸어 주었더니
리눅스에서 상기의 에러와 같은 현상이...
도저히 짐작이 안가요 ㅠ.ㅠ.............
이게 어떤 일인지...
ls | more | sort 의 효과를 내는 프로그램. #include <stdio.h> #include <fcntl.h> main() { int i, LMpipe_io[2], MSpipe_io[2]; pipe(LMpipe_io); pipe(MSpipe_io); if(fork() == 0) { printf("testing one\n"); dup2(LMpipe_io[1],1); close(LMpipe_io[0]); execlp("ls","ls","-l",0); } else { / // else if(fork() == 0) { printf("testing two\n"); dup2(LMpipe_io[0],0); close(LMpipe_io[1]); // dup2(MSpipe_io[1],1); // close(MSpipe_io[0]); execlp("more","more",0); } /* else { printf("testing three\n"); dup2(MSpipe_io[0],0); close(MSpipe_io[1]); execlp("/bin/sort","sort",0); } printf(" testing four\n"); for(i=0; i<2; i++) { close(LMpipe_io[i]); close(MSpipe_io[i]); } */ }
댓글 달기