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

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

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

  • перенаправить в тот же файл, что и исходный файл, обработанный командой
  • Как перенаправить вывод запущенной программы в / dev / null
  • Захват вывода без перенаправления и оставьте его на терминале тоже
  • Почему некоторые linux-инструменты записывают в STDERR вместо STDOUT по умолчанию?
  • Когда следует использовать перенаправление ввода?
  • Почему перенаправление STDERR на / dev / null выполняется таким образом?
    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() .

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

  • Что случилось с этим использованием перенаправления?
  • является ли Linux перенаправлением «>>» медленнее с большими файлами?
  • Как перенаправить вывод запущенной программы в / 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 | : 
    Linux и Unix - лучшая ОС в мире.