유닉스 쉘 구현할 때 파이프 기능구현 질문있습니다
글쓴이: fhdaos10 / 작성시간: 토, 2013/12/07 - 1:30오후
int join(char *ang[]){ pid_t pid[npipe+1]; int p[npipe][2], status; int i,j; char **com[10]; ang[pipe_p[0]] = NULL; com[0] = ang; //printf("%s11\n", com[0][0]); for(i=1; i<npipe + 1; i++){ if(pipe_p[i] != 0) ang[pipe_p[i]] = NULL; com[i] = ang+(pipe_p[i-1]+1); } for(i=0; i<npipe; i++){ // PIPE생성 if(pipe(p[i]) == -1) fatal("pipe call in join"); } for(i=0; i<=npipe; i++){ switch(pid[i] = fork()){ // 자식이 손자를 만든다 case -1: fatal("2nd fork call in join"); case 0: // 쓰는 프로세스 if(i == 0){ dup2(p[i][1],1); // for(j=0; j<=npipe; j++){ close(p[i][0]); close(p[i][1]); // } execvp(com[i][0], com[i]); fatal("1st execvp call in join"); } else if(i==npipe){ dup2(p[i-1][0],0); // for(j=0; j<=npipe; j++){ close(p[i][0]); close(p[i][1]); // } execvp(com[i][0], com[i]); fatal("2st execvp call in join"); } else{ dup2(p[i-1][0],0); dup2(p[i][1],1); for(j=0; j<=npipe; j++){ close(p[j][0]); close(p[j][1]); } execvp(com[i][0], com[i]); fatal("1st execvp call in join"); } } // end switch } // end for for(j=0; j<npipe; j++){ close(p[j][0]); close(p[j][1]); } /*for(i=0; i<npipe+1; i++){ printf("%d\n", pid[i]); }*/ while(waitpid(pid[npipe], &status, WNOHANG == 0)) sleep(1); return 0; }
며칠을 고민해봐도 어디가 문제인지 답답하네요ㅜㅜ
(ang는 char *avg[]의 포인터(즉 더블포인터)입니다. avg의 각 원소는 char형 배열의 각 부분을 가리키고 있는데 구체적으로 말씀드리자면
l|s|\0|||w|c|\0 과 같은 char 배열이 있다면
avg[0]은 l의 주소를, avg[1]은 |(파이프)의 주소, avg[2]는 w의 주소를 저장하고 있습니다.)
끝으로 파이프 실행했을때 에러화면입니다.
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 14.55 KB |
Forums:
댓글 달기