io перенаправление на «крест» 2 программы

Как «пересечь» stdin и stdout двух программ? В частности, у меня есть 2 программы, называющие pgm1 и pgm2 , они являются интерактивными играми tic-tac-toe. Они оба выводят число (0to8), указывающее позицию, где он хочет отметить и ожидать другого номера (0to8), указывающего, где пользователь хочет отметить. Разница между двумя: pgm1 делает первый ход, а pgm2 делает второй ход. Они оба отлично работают через интерактивного пользователя. Можно ли их заставить играть друг против друга с помощью перенаправления io?

Я тщетно пробовал следующие вещи:

  1. Откройте pgm2 в отдельном терминале (он ждет ввода), найдите pid. Затем запустите pgm1 в другом терминале ./pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
  2. Сделано 2 трубы с использованием mkfifo, скажем, pipe1 и pipe1 и pipe2 следующее в двух разных терминалах: ./pgm1 < pipe1 > pipe2 и ./pgm2 < pipe2 > pipe1
  3. попробовал два вышеперечисленных, выполнив pgm1 перед pgm2, запустив pgm2 перед pgm1
    Я обязательно использовал fflush(stdout) в обеих программах сразу после использования printf() .

Может ли кто-нибудь сказать мне, что я потерял / или ошибаюсь / или это даже возможно?

2 Solutions collect form web for “io перенаправление на «крест» 2 программы”

Вы должны иметь возможность работать с FIFO и трубой.

 $ mkfifo fifo $ ./pgm2 < fifo | ./pgm1 > fifo 

Входной сигнал программы 2 – это fifo, и выходы в трубу. Запрограммируйте входной канал и выведите его на фазу.

Будьте осторожны: это очень здорово в целом и может затормозить, если «пинг / понг» между процессами не является совершенным.

См. Также этот вопрос переполнения стека: как перенаправить вывод второго процесса на stdin 1-го процесса?

Вы зашли в тупик: ./pgm1 < pipe1 > pipe2 и ./pgm2 < pipe2 > pipe1

open("pipe1", O_RDONLY) выполняемое оболочкой перед выполнением pgm1 будет блокироваться до тех пор, пока что-то еще не open запись на том же самом канале. Пока это не будет сделано, он не сделает следующий open("pipe2", O_WRONLY) .

То же самое для другого. open("pipe2", O_RDONLY) будет блокироваться и потому, что open("pipe2", O_WRONLY) не будет выполнен, так как другая оболочка ждет писателя на pipe1 , у вас есть тупик.

Если бы вы его написали

 pgm1 < pipe1 > pipe2 & pgm2 > pipe1 < pipe2 

Это сработало бы.

В Linux вы также можете написать:

 { pgm1 <&3 3<&- | pgm2 3<&-; } 3< /dev/fd/1 | : 
  • перенаправить в тот же файл, что и исходный файл, обработанный командой
  • Восстановление вывода на терминал после выдачи «exec &> filename»
  • Что случилось с этим использованием перенаправления?
  • Когда следует использовать перенаправление ввода?
  • Как определить, является ли вывод команды или сценария оболочки стандартным или stderr
  • Почему я могу добавить файл, но не перезаписать его?
  • Вывод команды перенаправления на / dev / null
  • Предостережения с перенаправлением Stdout / Stderr в файлы?
  • Почему перенаправление STDERR на / dev / null выполняется таким образом?
  • Ограничить размер файла журнала
  • Как отправить надстройку stdout в multilog и второй процесс
  • использование аргумента командной строки с перенаправлением
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.