:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
09/09/18 23:33
일단 제가 보기로는.. 파이프가 가물가물해서 코드만 보고 답을 말씀드리기는 참 어렵고;
리눅스를 실행해볼 수 있는 환경도 아니라 그냥 버그를 찾을 수 있는 방법에 대해 간단하게 조언을 드릴게요. 지금 프로세스 세 개를 띄우시는데 어디에서 문제가 발생하는지 알기 어려운 상황이니까 차례로 범위를 줄여 나가는 식으로 문제를 파악하시는 것이 좋을 것 같습니다. 예를 들자면 먼저 코드를 이런 형태로 줄인 다음 #include <stdio.h> #include <ctype.h> int main() int fd[2]; int fd1[2]; int input, output; int n; char buf[10]; pipe(fd); // process A and B pipe pipe(fd1); // process B and C pipe if(fork()==0){ if(fork()==0){ // process A return 0; else // process B
return 0; } else // process C
} 여기서 무한루프가 생기지 않는 걸 확인하시고 (여기서 생긴다면 fork와 pipe 자체에서 근본적인 문제가 있는 거니 해결하시면 되겠고..) 여기까진 잘 된다! 그렇다면, #include <stdio.h> #include <ctype.h> int main() int fd[2]; int fd1[2]; int input, output; int n; char buf[10]; pipe(fd); // process A and B pipe pipe(fd1); // process B and C pipe if(fork()==0){ if(fork()==0){ // process A input = open("input.txt", 0); close(fd[0]); while ((n = read(input, buf, 10)) != 0) write(fd[1], buf, n); close(input); close(fd[1]); return 0; else // process B
return 0; } else // process C
} 이런 식으로 "무한루프를 유발하는 놈은 A 프로세스인가?" 하는 가설을 확인해보세요. 만약 통과하고, 같은 방식으로 A,B,C 프로세스를 모두 테스트해보고, 모두 문제가 없다. 그렇다면 이번엔 A,B만, B,C만, C,A만 돌려서 테스트해보는 식으로 프로세스 상호간에 무한루프를 유발하는 요소가 없는지 살펴보시고, 이래도 문제가 없다면... 파이팅! (죄송합니다) 여튼 이런 식으로 우선 범위를 줄여보시는 게 좋을 것 같습니다. ^^; 도움 안되는 답변이었으면 죄송합니다 (__)
09/09/19 00:03
네.. 제 말은 프로세스별로 확인해보면서 무한루프가 생성되는 현상이 '어디에서 발생하는지' 확인해보는 게 어떨까 하는 거였는데..
상황을 잘 모르니 정확한 답변이 못되었던 것 같습니다.;
|