[UNIX Shell Programming] PIPE 질문입니다.
가시내
질문 제목 : [UNIX Shell Programming] PIPE 질문입니다.질문 요약 :PIPE를 이용해서 3개의 command를 처리하려고 하는데 3번째 command 작동이 제대로 이루어지지 않습니다.질문 내용 : 아래 소스코드는 PIPE 처리만 하는 부분의 code 입니다.
int join(char *com1[], char *com2[], char *com3[], int pipecounter)
{
int p1[2], p2[2], status = 0;/* 1st Process =(p1[1] p1[0])= 2nd Process =(p2[1] p2[0])= 3rd Process */
/* 1번째 Command Process 와 2번째 Command Process 사이의 pipe 생성 */
if(pipe(p1) == -1)
fatal(pipe call in join\n);switch(fork())/* Child Process 생성 */
{
case -1:/* Child Process 생성 실패 */
fatal(1st fork call in join\n);
/* ---===--- 1번째 Command 수행을 위한 Process ---===--- */
case 0:
dup2(p1[1],1);/* stdout 을 2번째 Command Process 와의 pipe 로 연결 */
close(p1[0]);/* File Descriptor 를 닫아준다 */
close(p1[1]);
execvp(com1[0], com1);/* 1번째 Command 수행 */
fatal(1st execvp call in join\n);
/* ---===--- 2번째 또는 3번째 Command 수행을 위한 Process ---===--- */
default:
if(pipecounter == 1)/* PIPE 가 1개인 Command 라면 */
{
printf(파이프 1개일때다\n);
dup2(p1[0],0);/* stdin 을 1번째 Command Process 와의 pipe 로 연결 */
close(p1[0]);/* File Descriptor 를 닫아준다 */
close(p1[1]);
execvp(com2[0], com2);/* 2번째 Command 수행 */
fatal(2nd execvp call in join\n);
}
else if(pipecounter == 2)/* PIPE 가 2개인 Command 라면 */
{
/* 2번째 Command Process 와 3번째 Command Process 사이의 pipe 생성 */
if(pipe(p2) == -1)
fatal(pipe call in join\n);
switch(fork())/* Child Process 생성 */
{
case -1:/* Child Process 생성 실패 */
fatal(2nd fork call in join\n);
/* 2번째 Command 수행을 위한 Process */
case 0:
printf(2커맨드 실행한다\n);
dup2(p1[0],0);/* stdin 을 1번째 Command Process 와의 pipe 로 연결 */
close(p1[0]);/* File Descriptor 를 닫아준다 */
close(p1[1]);dup2(p2[1],1);/* stdout 을 3번째 Command Process 와의 pipe 로 연결 */
close(p2[0]);/* File Descriptor 를 닫아준다 */
close(p2[1]);
execvp(com2[0], com2);/* 2번째 Command 수행 */
fatal(2nd execvp call in join\n);
/* 3번째 Command 수행을 위한 Parent Process */
default:
printf(3커맨드 실행한다\n);
dup2(p2[0],0);/* stdin 을 2번째 Command Process 와의 pipe 로 연결 */
close(p2[0]);/* File Descriptor 를 닫아준다 */
close(p2[1]);
execvp(com3[0], com3);/* 3번째 Command 수행 */
fatal(3rd execvp call in join\n);
}
}
}
}
실제로 테스트 해보니 2번째 command와 3번째 command 사이에 생성한 pipe에 문제가 있는것 같습니다.
stdout : .............
이런 에러를 출력하는데요. 문법적으로 문제가 있는건지 어떤건지
아무리 생각해봐도 무슨 문제인지를 모르겠습니다.
고수님들의 조언을 구합니다.