перенаправление io для “пересечения” 2 программ

Нет, но можно всегда складывать все, в чем Вы нуждаетесь в одном блоке:

function XX() {
 (
  some
  commands
  here
 ) 2>error.log
}
3
27.09.2013, 12:05
2 ответа

Необходимо смочь заставить это работать с FIFO и каналом.

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

Вход two's программы является FIFO и выводами к каналу. Программа вход является каналом и выводами к FIFO.

Предупредите хотя: это очень колоритно в целом и может зайти в тупик, если "ping/вонь" между процессами не прекрасен.

См. также этот вопрос о Переполнении стека: Как перенаправить stdout 2-го процесса назад к stdin 1-го процесса?

3
27.01.2020, 21:16
  • 1
    Спасибо это работает... Только для знания разве это не эквивалентно 2-й точке, которую я попробовал? почему это работает, в то время как это не? –  kumar 27.09.2013, 12:41

У Вас есть мертвая блокировка в Вашем: ./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 | :
2
27.01.2020, 21:16

Теги

Похожие вопросы