PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2009/09/18 22:53:18
Name 마타하리
Subject 리눅스 c pipe관련 질문입니다.
파이프는 각각 process A와 B, B와 C로 연결한다고 생각했습니다.
process A는 input파일에서 파일을 읽어들여 pipe(fd)로 보내는 역할
process B는 pipe(fd)에서 읽어들여 영문소문자이면 대문자로 바꿔준후 pipe(fd1)으로 보내는 역할
process C는 pipe(fd1)에서 읽어들여 output파일을 생성하는 역할
이렇게 했는데요.

컴파일은 되는데 무한루프를 도는것 같습니다.
무엇이 문제인지 잘 몰라서 여쭤봅니다;;

#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
            close(fd[1]);
            close(fd1[0]);
            while((n = read(fd[0], buf, 1)) != 0){  
                if(islower(*buf))
                    *buf = toupper(*buf);
                write(fd1[1], buf, n);
            }
            close(fd[0]);
            close(fd1[1]);
            wait();
            return 0;
        }
    }
    else{ // process C
        close(fd1[1]);
        output = creat("output.txt", 0666);
        while((n = read(fd1[0], buf, 10)) != 0)
            write(output, buf, n);
        close(output);
        close(fd1[0]);
        wait();
    }
}

통합규정 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/18 23:41
수정 아이콘
원하는대로 output파일이 생성되긴해요. 그런데 터미널에서 무한루프가 돌아서 여쭤봤던거에요. 아무튼 답변 감사합니다.
필리온
09/09/19 00:03
수정 아이콘
네.. 제 말은 프로세스별로 확인해보면서 무한루프가 생성되는 현상이 '어디에서 발생하는지' 확인해보는 게 어떨까 하는 거였는데..
상황을 잘 모르니 정확한 답변이 못되었던 것 같습니다.;
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
64219 여자가수들 콘서트 계획 질문할께요~~ [4] 안시크1856 09/09/19 1856
64218 Windows 7에서 설치되는 CDSpace 버젼 좀.. [2] Zakk Wylde5600 09/09/19 5600
64217 q9550 요크필드 cpu 쓰시고 계시는분 질문이요 [3] 이민님닉냄수1653 09/09/19 1653
64216 예전의 16비트 게임기에서 나오는 음악 비슷한 장르 [1] 유유히2127 09/09/19 2127
64215 추리소설의 최고봉 [12] 모노크롬3337 09/09/19 3337
64214 외국 p2p싸이트중에.. [3] 끝없는사랑3378 09/09/19 3378
64213 지겨우시겠지만 PMP 구매에 도움 부탁드립니다 [2] Valueinvester1925 09/09/19 1925
64211 음.. 이성관계 질문입니다. 이런 질문 싫으신 분은 클릭 자체를 하지 마세요~ [12] 크흠..2679 09/09/19 2679
64210 [조립 컴퓨터 견적관련] 질문입니다... [1] 남자의눈물1900 09/09/19 1900
64209 워3 언데드가 x망한 이유가 뭔가요? [22] 고등어3마리3549 09/09/19 3549
64208 입영 연기 관련 질문. [5] 고민하는프로1610 09/09/19 1610
64207 vector cross product 관련해서 간단한 질문입니다; [5] DEICIDE1989 09/09/18 1989
64206 음 속이 좁은듯 합니다.(질문글이 아니예요) [11] 언뜻 유재석1674 09/09/18 1674
64205 면접 볼 정장 어디가 괜찮나요 [8] 돌아와요! 영웅1936 09/09/18 1936
64204 리눅스 c pipe관련 질문입니다. [3] 마타하리2090 09/09/18 2090
64203 운동화에 기름때가 묻었는데 쉽게 제거할 수 있는 방법이 없을까요? [2] 윤성호14808 09/09/18 14808
64202 한국축구 역대 국가대표 BEST 11 질문입니다. [7] Elminsis2353 09/09/18 2353
64200 핸드폰에 대해 잘 아시는 분 있나요? [8] 유재석과면상1911 09/09/18 1911
64199 타미플루 살 수 있는 방법이 있을까요 [1] 오늘도행복하1908 09/09/18 1908
64198 대학생 연합 동아리 [16] 별헤는밤2991 09/09/18 2991
64197 G1마우스를 구입했는데요... [7] 비야레알1963 09/09/18 1963
64196 음..남자가 여자노래 부르면 이상한 건가요? [27] Forever.h5848 09/09/18 5848
64195 Bar는 어떤곳인가요?? [8] DeStinY....2705 09/09/18 2705
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로