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() .

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

  • Перенаправление после запуска процесса
  • Что случилось с этим использованием перенаправления?
  • Почему я могу добавить файл, но не перезаписать его?
  • Как перенаправить вывод запущенной программы в / dev / null
  • Почему некоторые linux-инструменты записывают в STDERR вместо STDOUT по умолчанию?
  • использование аргумента командной строки с перенаправлением
  • Как определить, является ли вывод команды или сценария оболочки стандартным или stderr
  • Почему перенаправление STDERR на / dev / null выполняется таким образом?
  • 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 | : 
    Interesting Posts

    Может ли кто-нибудь диагностировать это сообщение об ошибке JACK?

    Как выглядят крупные компьютеры, на которых были подключены реальные терминалы?

    Каково потребление дискового пространства для установки Fedora Atomic (r25)?

    команда оболочки 'var = ""; echo $ var 'имеет выход «h», любое объяснение?

    Расширение истории рыб

    Пакетные расширения в нижнем регистре

    fgrep или grep -F, какой из них лучше для переносного скрипта?

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

    Как читать иглу части команды sed из файла?

    Для чего нужны разные CD и DVD?

    Переименование нескольких файлов, удаление всего одного экземпляра шаблона

    Как заставить скрипт bash выполнить определенное действие с ошибками команды _each_?

    Установленный ресивер исчезает после перезапуска

    Как добавить строку к нескольким файлам в древовидной структуре каталога?

    Владение Apache и разрешения для wordpress

    Linux и Unix - лучшая ОС в мире.