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;
}
}
對不起,如果代碼似乎有點脫節。我不得不把它從文件中拉出來。
你能告訴我們一些代碼嗎? –
CTRL + D不發送信號,但是使從終端讀取EOF的內容成爲可能。 – ThiefMaster
@JoachimPileborg我添加了一些代碼。 – chustar