2012-11-16 2 views
-1

나는 C로 셸을 구현하고 있습니다. 이것은 파이핑에 사용하는 함수입니다. "ls | a"를 코드에 넣으면 (예 : 유효하지 않은 명령으로 파이프를 파이프합니다), 자식 프로세스를 종료해야합니다. 어떻게하면 주요 기능으로 돌아 가게 할 수 있습니까? ps 할 때 똑같은 일이 발생합니다. 또는 ps | pwd 등등 그러나 ls | ps는 bash와 동일하게 작동합니다. 나는 ls를 안다. ps 또는 ps | 이해가 안되지만 적어도 bash와 동일한 출력을 제공해야합니다.C에서 셸 구현의 파이프

void exec3(char **args, char **args2){ 
    int fd[2]; 
    pid_t pid,pid1; 
    int status; 
    pipe(fd); 
    int e=0; 
    if ((pid = fork()) < 0) {  
     printf("*** ERROR: forking child process failed\n"); 
     exit(1); 
    } 

    else if ((pid1 = fork()) < 0) {  
     printf("*** ERROR: forking child process failed\n"); 
     exit(1); 
    } 

    else if (pid == 0 && pid1!=0){ 
     printf("in 1\n"); 
     close(1); 
     dup(fd[1]); 
      close(fd[0]); 
     close(fd[1]); 

      if(execvp(args[0],args)<0){ 
       printf("**error in exec"); 
       close(fd[0]); 
       close(fd[1]);   
       exit(1); 
      } 
    //printf("exiting 1\n"); 
    exit(0); 
} 

else if (pid1 == 0 && pid!=0) { 
    printf("in 2\n"); 
    close(0); 
    dup(fd[0]); 
    close(fd[1]); 
    close(fd[0]); 
    if((e=execvp(args2[0],args2))<0){ 
      printf("**error in exec2 "); 
      close(fd[0]); 
      close(fd[1]); 

     exit(1); 
    } 
    exit(0); 
} 

else { 
     close(fd[0]); 
     close(fd[1]); 
     fflush(stdout) ;    
     while (wait(&status) != pid); 
     while (wait(&status) != pid1); 
    } 
} 
+1

http://advancedlinuxprogramming.com/과 같은 좋은 책을 읽고'sash'와 같은 작은 자유 소프트웨어 셸의 소스 코드를 연구하십시오. –

+0

빠른 질문 : epitech 출신입니까? :) – Intrepidd

+0

오류 메시지가 stderr에 속합니다. 'printor ("ERROR ...'는 * 항상 * 틀린 것입니다 ..'perror'는 당신의 친구입니다 –

답변

-1

당신은 해결책에 가깝습니다. 어떻게하면 popen()is implemented, 그게 당신이 뭘하려고하는지보세요.

+0

어디에서 찾을 수 있습니까? 구글 시도, 찾지 못했습니다 – gitter

+0

실제로 나는 그것을 발견했지만 매우 복잡합니다. u가 실수를 지적 할 수 있으면 감사 할 것입니다. – gitter