2012-11-16 105 views
1

對於一個任務,我們需要實現一個帶有重定向和管道的基本shell。我的管道代碼退出程序,不再要求用戶輸入。管道在一個函數中執行,所以基本上控制不會返回到main。我該如何做到這一點?這裏是我的代碼:在Unix中使用管道C

void execute_pipe(char **argv,char **args) 
{ 

    int pfds[2]; 
    pid_t pid; 
    int status; 
    pipe(pfds); 
    if ((pid = fork()) < 0) {  
      printf("*** ERROR: forking child process failed\n"); 
      exit(1); 
    } 
    printf("here"); 
    if (pid==0) { 
     close(1);  
     dup(pfds[1]); 
     close(pfds[0]); 
      if(execvp(argv[0],argv)<0){ 
      printf("**error in exec"); 

     } 

    } 
    else { 
    while (wait(&status) != pid) ; 
     close(0);  
     dup(pfds[0]); 
     close(pfds[1]); 

      if(execvp(args[0],args)<0){ 
      printf("**error in exec"); 
     } 
    } 

} 
+2

...你有問題嗎? –

+1

什麼是問題 –

+0

對不起,問題是如何使它返回到主而不退出? – user1828941

回答

1

如果dup()dup2()管道標準輸入或標準輸出,你應該使用execvp()或它的一個親戚之前關閉既爲管文件描述符。 Add:

close(pfds[1]); 

給子代碼。

在您運行父進程之前子進程必須死亡(因爲您的wait()在循環中)。請注意,您應該檢查wait()未返回錯誤,例如ECHILD;如果有的話,你不會超越循環。同樣,你應該關閉兩個管道文件描述符。

請注意,如果孩子生成的數據超過管道數量,則孩子將被阻止寫入管道,而父母被阻止等待孩子死亡 - 死鎖。


如何使它返回主不退出?

您不能使該代碼返回到main(),除非子代或父代未能按照給出的命令execvp()。你可能需要額外的fork()

等待通常由父進程完成,而不是由兩個孩子中的一個完成。

+0

謝謝,像魅力一樣工作。我們還需要在等待進程結束之前關閉管道。 – user1828941