У меня есть программа, которая fork()
создает новый процесс, а затем перезаписывает этот новый процесс stdin
с помощью моего дескриптора файла fd
.В этом процессе я затем использую execvp()
для выполнения wc
, и он должен прочитать свой ввод от родителя.Затем в родительском объекте я пишу в конец записи канала и по завершении записи закрываю канал.
Проблема в том, что wc
все еще ожидает ввод и не выводит.
Обычно,Я могу остановить wc
, набрав CTRL D , но я не могу отправить этот сигнал на C / C ++.
Как мне сказать wc
прекратить чтение?
РЕДАКТИРОВАТЬ : я следовал идиомам pipe / fork / 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;
}
}
Извините, если код кажется немного несвязным.Мне пришлось собрать его вокруг файла.