2012-11-16 114 views
-1

我在C中實現一個殼。這是我用於管道的功能。當我在代碼中放入「ls | a」(即用無效的命令來傳遞一個有效的命令)時,它並不像它應該退出子進程。我如何讓它回到主要功能? 同樣的事情發生時,我做PS | ls或ps |密碼等,但ls | ps的工作原理與bash相同。我知道ls | ps或ps | ls沒有道理,但至少他們應該給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/和研究一些小的自由軟件的shell,比如'sash'的源代碼。 –

+0

快問題:你是來自epitech嗎? :) – Intrepidd

+0

錯誤消息屬於stderr。 '的printf(「ERROR ...'是*始終*錯了。'perror'是你的朋友。 –

回答

-1

您已接近解決方案。看看你如何努力,如何才能做到這一點。

+0

我在哪裏可以找到?嘗試過谷歌,沒有找到。 – gitter

+0

其實我發現它,但其非常複雜,上面我的水平,我如果你能指出錯誤,會很感激。 – gitter