2011-11-22 143 views
3

我有一個程序,fork()是一個新的過程,然後用我的文件描述符管道fd覆蓋新過程的stdin。在這個過程中,我然後使用execvp()來執行wc並且它應該從父文件讀取它的輸入。 在父項中,然後寫入管道的寫入端,寫完後關閉管道。如何告訴wc停止閱讀?

問題是wc仍然期待輸入並且不會退出。
通過輸入CTRLD我可以停止wc但我似乎無法在C/C++中發送該信號。

如何讓wc停止閱讀?

編輯:我的確遵循了管/叉/ DUP/EXEC成語(我認爲這就是它叫什麼。)
的流工作與需要輸入其他程序,它只是wc需要特殊EOF到停止閱讀。

int in_fd[2]; 
//parent-child setup 
pipe(in_fd); 
child = fork(); 
if(child == 0) { 
    close(in_fd[1]); 
    dup2(in_fd[0], 0); 
    close(in_fd[0]); 
    execvp(cmdArg[0], cmdArg); 
} else { 
    close(in_fd[0]); 
    in_pid = fork_in_proc(); 
    close(in_fd[1]); 
} 

//writing function 
pid_t fork_in_proc() { 
    string line; 
    pid_t in_pid; 
    if((in_pid = fork()) == 0) { 
     close(in_fd[0]); 
     ifstream file(stream_file[STREAM_IN].c_str(), ios_base::in); 
     if (file.bad()) { 
      cerr << "File read error\n"; 
      return 1; 
     } 

     while(file.good()) { 
      getline(file, line); 
      if(file.good()) { 
       write(in_fd[1], line.c_str(), line.length()); 
      } 
     } 
     int end = 3; 
     write(in_fd[1], &end, sizeof(end)); 
     file.close(); 
     close(in_fd[1]); 
     cout << "PIPE IN" << endl; 
     exit(0); 
    } else { 
     return in_pid; 
    } 
} 

對不起,如果代碼似乎有點脫節。我不得不把它從文件中拉出來。

+0

你能告訴我們一些代碼嗎? –

+1

CTRL + D不發送信號,但是使從終端讀取EOF的內容成爲可能。 – ThiefMaster

+0

@JoachimPileborg我添加了一些代碼。 – chustar

回答

0

wc當您關閉stdout時退出。

相關問題