Есть ли такая вещь, как двусторонний трубопровод? Я хочу, чтобы ввод и вывод были интерактивными между двумя простыми программами

Я хочу написать программу для решения простой игры в догадки. Я изучаю трубопроводы командной строки и перенаправления, и поэтому мне было интересно, возможно ли это вообще.

По сути, я хочу, чтобы выходные данные одного были входом другого, а затем выходные данные этого элемента — входом другого.

Это все просто для удовольствия, поэтому я могу учиться, я знаю, что могу изменить исходный код игры в догадки и включить алгоритм решения, но просто для забавы, давайте предположим, что у меня нет исходного кода.

Это вообще возможно? Вот мой код:

//GuessingGame.cc

#include <cstdlib>
#include <iostream>

using namespace std;

int main() {
srand(time(NULL));
int number = rand()%100;
int guess = -1;
int trycount = 0;

while(guess != number && trycount < 8) {

cout << "Please enter a guess: ";
cin >> guess;

if(guess < number)
cout << "Too low" << endl;

else if(guess > number)
cout << "Too high" << endl;

trycount++;
}

if(guess == number)
cout << "You guessed the number!";

else
cout << "Sorry, the number was: " << number;

return 0;
}

Solver.cc

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]) {

string prompt;
int high = 100;
int low = 0;
int guess = 50;

getline(cin,prompt);
if(prompt == "Please enter a guess: ")
cout << guess;

while(true) {
getline(cin,prompt);
if(prompt == "Too low")
low = guess;

else if(prompt == "Too high")
high = guess;

else if(prompt == "You guessed the number!")
return 0;

guess = (low+high)/2;
cout << guess;
}
}

Надеюсь, вы понимаете, что я делаю, и меня не волнует программа, это всего лишь пример. Главный вопрос заключается в том, можете ли вы взаимодействовать с двумя разными программами, используя перенаправления и конвейеры и тому подобное. Спасибо

3

Решение

Труба по определению является устройством односторонней связи. Однако это можно решить, используя две трубы, по одной в каждом направлении. Проблема в том, что это не может быть легко выполнено через оболочку, вам нужно создать программу для настройки каналов, создать процессы для ваших программ и затем выполнить их с каналами, настроенными как правильные каналы ввода / вывода.

Единственный способ, которым я могу думать о том, как сделать это возможным через оболочку, — это использовать mkfifo Команда создать две трубы. Запустите одну программу в фоновом режиме с перенаправлением ввода и вывода из / в правильные каналы, а затем проделайте то же самое с другой программой, но используйте другой канал в качестве входа и выхода.

4

Другие решения

Трубы односторонние. Если вы открываете канал на выбранном вами языке программирования, вам придется самостоятельно создавать два канала.

Традиционная абстракция для двустороннего ввода-вывода, предоставляемая семейством оболочек Korn, — это сопроцесс. Синтаксис для оболочек с «ksh» в их именах в основном переносимый.

ksh93 / mksh / другие pdkshes:

{ cmd1...; } |& cmd2 <&p >&p

Bash и Zsh, хотя и имеют много одинаковых функций, имеют разные несовместимые синтаксисы. Например, Bash добавляет дополнительное ключевое слово и назначает FD массиву.

coproc { cmd1; }; cmd2 <&"${COPROC[0]}" >&"${COPROC[1]}"

Основными альтернативами сопроцессам являются замены процессов, обычные конвейеры и именованные каналы, но сами по себе они не являются двунаправленными.

2

По вопросам рекламы [email protected]