Печать из трубы FIFO без вмешательства?

У меня есть несколько программ на C, отправляющих сообщения туда и обратно через FIFO именованные каналы в Unix, и я хочу посмотреть, что происходит через каналы, используя внешнюю программу. Проблема в том, что если я использую cat , он останавливается после того, как в следующий раз моя программа вызовет write() и закрывает трубку, нарушая связь между программами … и тогда происходят плохие вещи. Я не понимаю, почему cat закрывает мою трубку. EDIT: На самом деле, я сделал то же самое сегодня, и вместо того, чтобы закрыть трубу, он просто заставил процесс перестать читать.

Так что есть что-то вроде cat за исключением того, что оно вообще не будет мешать трубам, просто распечатайте все, что видит?

В случае, если это имеет значение, я создаю такие каналы в C:

 outs[i2/2] = open("/tmp/pipe_w", O_WRONLY); ins[i2/2] = open("/tmp/pipe_r", O_RDONLY); 

Обновление: Вот пример терминала.

Мои процессы печатают этот вывод, когда они открывают трубы:

 Opened in pipe at /tmp/ai1In Opened out pipe at /tmp/ai1Out 

Затем я делаю это в отдельной оболочке:

 admin$ cat /tmp/ai1Out ai1 

Он видит сообщение «ai1», а затем ничего. Процесс считывания этой трубы заканчивается в ожидании. Я убиваю cat , но труба по-прежнему не читается.

Обновление 2:

cat [path] | tee [path] cat [path] | tee [path] работает в некоторых случаях. Это не мешает заметно с моей трубой ai1Out , но это мешает ai1In . Разница должна быть связана с моим кодом. Независимо от этого, это означает, что выполнение этой команды оказывает некоторое влияние на другие процессы, используя каналы, которые я не хочу. Когда я пытаюсь прочитать ai1Out , я просто вижу это, затем процесс записи в этот канал получает ошибку при следующем вызове write() :

 admin$ cat /tmp/ai1In | tee /tmp/ai1In ]2,15,43,66,65,61,53,20,30,27,40,16,50,41,48[[[[[[[[ 

One Solution collect form web for “Печать из трубы FIFO без вмешательства?”

Определение трубы состоит в том, что данные, записанные в нее, считываются с другого конца. Труба не дублирует данные. Чтение на трубе – разрушительная операция. Если на трубе есть два считывателя, каждый байт будет считываться только одним из читателей.

Если вы хотите отслеживать связь между двумя программами через канал, вы можете сделать это, вставив tee между программами. Есть тогда две трубы: одна от писателя до tee и одна от tee до читателя.

 mkfifo pipe_w pipe_r writer >pipe_w reader <pipe_r <pipe_w tee pipe_r 

Схема именования труб в вашем вопросе непоследовательна, поэтому я не знаю точно, что вы пробовали. Похоже, вы пытались вернуть данные из трубы обратно в себя. Это не сработает: вы создали замкнутый цикл, где некоторые данные возвращаются в трубу навсегда (только некоторые данные, потому что непредсказуемо, какие байты возвращаются в трубу и какие байты будут поступать в исходное читатель).

Если между двумя процессами есть труба, и вы не можете изменить сантехнику, самый простой способ следить за ней – это отслеживать процесс записи или чтения. Например, если процесс записи имеет PID 123 и открыт канал в файловом дескрипторе 4, в Linux вы можете использовать

 strace -p123 -e write=4 
  • Общение с bash с помощью grunt shell
  • Использование именованных каналов для отправки нажатия клавиш в интерактивную программу
  • Почему именованный канал не удаляется после перезапуска системы?
  • Вывод в stdout работает, сбой при перенаправлении в файл или в fifo
  • Фильтрация или обтекание определенных разделов файла
  • закрытие дескрипторов нежелательных файлов
  • Rsync над пользовательской оболочкой с fifo
  • Не допускайте зависания «echo STRING> fifo», когда ничего не читает, что FIFO
  • Открытие именованных блоков труб навсегда, если труба удалена без подключения
  • Как я могу подключать команды к любому терминалу?
  • Байт Смещения для трубы / FIFO
  • Linux и Unix - лучшая ОС в мире.