2013-10-23 58 views
0

一直在使用shell項目。我已經設置了I/O重定向,但是我顯然錯過了一些東西,因爲當用像「ls -al> outfile」這樣的行進行測試時,它會在我的桌面上創建outfile,但將其保留爲空,並且程序將返回以下錯誤:Linux shell上的I/O重定向

ls: >: No such file or directory 
Error: Failure to wait for child. 
: Interrupted system call 

這裏是我的代碼:

 pid_t child = fork(); 


     if (child < 0) 
     { 
      perror("Error: Fork failure.\n"); 
      exit(1); 
     } 

     else if (child == 0) 
     { 

      //If < file (read) 
      if (inpt) 
      { 
       int fd_in = open(argumnts[index+1], O_RDONLY, 0); 
       dup2(fd_in, STDIN_FILENO); 
       close(fd_in); 
       inpt = 0; 
      } 

      //If > file (create or truncate) 
      if (outpt) 
      { 
       int fd_out_A = open(argumnts[index+1], O_CREAT | O_TRUNC, 0666); 
       dup2(fd_out_A, STDOUT_FILENO); 
       close(fd_out_A); 
       outpt = 0; 
      } 


      execvp (argumnts[0], argumnts); 

      perror(command); 
      exit(0); 
     } 
     else 
     { 
      inpt = 0; 
      outpt = 0; 
      outptApp = 0; 

      if (waitpid(child, 0, WUNTRACED) < 0) 
       perror("Error: Failure to wait for child.\n"); 
     } 
    } 

} //End While(1) loop 

比較函數只是檢查是否命令參數輸入的是 「<」, 「>」 或 「>>」,然後返回包含它的索引。

不知道我在這裏錯過了什麼,但它會改變之前提到的錯誤。任何想法?

+1

您將在傳遞給'execvp()'的'arguments'數組中離開重定向操作符。所以'ls'試圖列出名爲'>'的文件。 – Barmar

+0

謝謝,這幫助了第一個錯誤。 – Gus

回答

3

有兩件事情正在進行。

  1. ls: >: No such file or directory可以通過調用execvp之前設置argumnts[index]=NULL被固定。 ls看到> outputfile作爲它應該列出的附加文件名。終止參數列表的NULL將處理該問題。

  2. Error: Failure to wait for child. : Interrupted system call:在等待時發生了一些事情。中斷的系統調用(EINTR)通常不是問題,可以重新啓動而沒有不良影響。我發現了以下建議here更換一次調用waitpid

"A typical code sequence would be:

while((pid = waitpid(,,)) == -1) { 

     switch (errno) { 

     case EINTR: continue; 

     default: printf(stderr, ...) 

       break; 

     }} 

    ... rest of normal waitpid-hanling goes here ... 

Also, you'll probably have to install a signalhandler for at least SIGCHLD . "

另外,我注意到你有沒有重定向標準錯誤,這可能會導致父母與孩子之間的互動。還有一個問題 - 你是否控制了C?如果是這樣,請參閱here

此外,WUNTRACED可能會或可能不是您要指定的內容,具體取決於您是否處理終端信號。請參閱waitpid(2)的聯機幫助頁,例如here。也許0WEXITED

+0

第一個錯誤現在消失了,但第二個錯誤仍在發生。沒有擊中控制-C。即使當我使用0而不是WUNTRACED時,父進程仍然無法等待。 – Gus

+0

我按照你的建議做了,在測試時:「cat outfile」outfile仍然在我的桌面上創建,但其中不包含任何內容。它仍然是空的。 : -/ – Gus

+0

@在這個例子中,添加'O_WRONLY'到'open()'調用>文件(http://www.cs.rutgers.edu/~pxk/416/notes/c-教程/ dup2.html)。如果這沒有幫助,那麼爲了進行健全性檢查,什麼設置了'inpt','outpt'和'outptApp'變量? 'comparator'? (注意:「參數標誌必須包含以下訪問模式之一:O_RDONLY,O_WRONLY或O_RDWR。」per [this](http://linux.die.net/man/2/open))。 – cxw