Как заставить 2 исполняемых файла общаться в обоих направлениях в Windows - PullRequest
1 голос
/ 24 мая 2010

У меня есть 2 консольных приложения Windows, чтение со стандартного ввода и запись в стандартный вывод. Я хотел бы предположить, что у меня нет исходного кода ни для одного из них (фактически у меня обычно есть исходный код одного из них).

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

Как это можно сделать? Я готов заняться программированием на C / C ++ или чем-то еще.

Oren.

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Это невозможно сделать в консоли, поскольку перенаправление потока всегда образует ациклический граф.

Чтобы получить циклическое перенаправление, которое вы ищете, вы можете написать небольшую программу, которая вызывает оба ваших исполняемых файла и управляет связью входных и выходных потоков каждого процесса. Каждая пара подключенных потоков (входной поток и выходной поток из каждой программы) будет нуждаться в потоке для извлечения данных из выходного потока и передачи их во входной поток. Таким образом, вам понадобится 2 потока, так как есть 2 набора пар потоков ввода / вывода.

Вот шаги для соединения различных потоков:

  • создать два буфера, B1 и B2.
  • запустить программу 1, (P1) и получить дескрипторы потока ввода и вывода.
  • подключите вход P1 к входной стороне буфера B1, а выход P1 - к выходной стороне буфера B2.
  • запустить программу 2 (P2) и получить дескрипторы потока ввода и вывода
  • подключите вход P2 к входной стороне буфера B2, а выход P2 - к выходной стороне буфера B1. (обратите внимание, что это B1 / B2 обратное соединение P1 выше.)

Буферы являются активными потоками, считывающими со стороны ввода и записывающими со стороны вывода.

Буфер должен будет определить конец потока на входной стороне и соответственно закрыть выходную сторону. Когда обе стороны закрыты, поток, работающий с буфером, может выйти.

0 голосов
/ 24 мая 2010

Вам нужно будет превратить два процесса в подпроцессы родительского процесса, который будет передавать сообщения между двумя процессами, и вам придется написать родительский процесс.

Существует множество языков, на которых можно решить эту проблему. Лично я бы подошел к этому с помощью модуля subprocess в Python. По сути, это обертка вокруг _popen (), к которой можно получить доступ в C / C ++, но если быстрый поиск в Google является каким-либо показателем, вам будет легче изучить Python, чем использовать его. Если вы знаете Ruby, есть подобная библиотека для Ruby.

В любом случае, я думаю, что использование сокетов было бы более чистым и более надежным, чем использование stdin и stdout, если это вообще возможно.

...