2012-11-10 7 views
3

코드는 명령을 입력으로 받아 실행합니다. 파이프도 처리됩니다. 문제는 내가 ls | grep x 명령을 입력하십시오. 프로세스 grep이 종료되지 않으므로 프로그램이 중지됩니다. 어떤 아이디어.pipe 및 exec를 사용하는 중 오류가 발생했습니다. 두 번째 명령이 종료되지 않습니다.

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <signal.h> 
void parse(int *cont,char *command,char **exarg) 
{ 
    char *x=strchr(command,'&'); 
    if(x!=NULL) 
    { 
     *cont=1; 
     *(--x)='\0'; 
    } 
    x=strtok(command," "); 
    while(x!=NULL) 
    { 
     *exarg++=x; 
     x=strtok(NULL," "); 
    } 
    *exarg='\0'; 
} 

int divide(char *cmd,char **cmdarr) 
{ 
    int i=0; 
    char *x; 
    x=strtok(cmd,"|"); 
    while(x!=NULL) 
    { 
     i++; 
     *cmdarr++=x; 
     x=strtok(NULL,"|"); 
    } 
    *cmdarr='\0'; 
    return i; 
} 

void main() 
{ 
    pid_t pid; 
    int cont; 
    int i=0; 
    int orgnum; 
    char *cmdarr[50]; 
    char c[50]; 
    int p1[2]; 
    int p2[2]; 
    char *argument[50]; 
    if(pipe(p1)<0) 
     printf("error\n"); 
    if(pipe(p2)<0) 
     printf("error2\n"); 
    for(;;) 
    { 
     printf("Enter the command:"); 
     gets(c); 
     if(!strcmp("exit",c)) 
      break; 
     orgnum=divide(c,cmdarr); 
     printf("%d\n",orgnum); 
     for(i=0;i<orgnum;i++) 
     { 
      pid=fork(); 
      if(pid==0) 
      { 
       if(i==0) 
       { 
        close(p1[0]); 
        close(p1[1]); 
        close(p2[0]); 
        if((i+1)!=orgnum) 
        { 
         dup2(p2[1],STDOUT_FILENO); 
         dup2(p2[1],STDERR_FILENO); 
        } 
        close(p2[1]); 
        parse(&cont,cmdarr[i],argument); 
        if((execvp(argument[0],argument))<0) 
        { 
         printf("Wrong cmd"); 
         exit(0); 
        } 
       } 
       else if(i>0) 
       { 
        if((i+1)%2==0) 
        { 
         close(p1[0]); 
         close(p2[1]); 
         dup2(p2[0],STDIN_FILENO); 
         close(p2[0]); 
         if((i+1)!=orgnum) 
         { 
          dup2(p1[1],STDOUT_FILENO); 
          dup2(p1[1],STDERR_FILENO); 
         } 
         close(p1[1]); 
        } 
        else if((i+1)%2==1) 
        { 
         close(p2[0]); 
         close(p1[1]); 
         dup2(p1[0],STDIN_FILENO); 
         close(p1[0]); 
         if((i+1)!=orgnum) 
         { 
          dup2(p2[1],STDOUT_FILENO); 
          dup2(p2[1],STDERR_FILENO); 
         } 
         close(p2[1]); 
        } 
        parse(&cont,cmdarr[i],argument); 
        if((execvp(argument[0],argument))<0) 
        { 
         printf("Wrng cmd"); 
         exit(0); 
        } 
       } 
      } 
      else if(pid>0){ 
       close(p1[0]); 
       close(p1[1]); 
       close(p2[0]); 
       close(p2[1]); 
       wait(NULL);} 
     } 
    } 
} 

답변

0

그래서 당신은주기 :

포크 는 "LS과 같이있을 때 부모
가까운 파이프

기다리면 다른 아이
간부
경우 | 그렙 foo는 ",

1 단계 : 당신은 chi LD, 모든 파이프를 닫고, 부모에 '에게 ls'이 (가) 종료를 기다린

2 단계 : 아이의 간부 인 '그렙', 그리고 입력으로 파이프를 사용하지만이 단계에서 그것들을 닫습니다 1.

파이프가 1 단계 제 2 공정 '그렙'용 루프와 같은 새로운 자식이 상기 프로세스에 의해 사용되고 있지 않기 때문에


+0

예는 (i = 0; i가 ZURA

+0

반복 미안 해요 지금 당신이 옳다 는걸 압니다. – ZURA