Intereting Posts
Смешанные языки в bash после обновления OS X до El Capitan На моей странице mediawiki отображается индекс обновления после обновления до apache 2.4.23 Элемент меню Fluxbox, который запрашивает некоторый ввод Получить имена устройств интерфейса Wi-Fi Трубопровод от grep до awk не работает Linux Mint 18: сетевой менеджер, не показывающий точки доступа Wi-Fi Система зависает при просмотре интернета Репозиторий для семейных фотографий Просмотр списка удаленных файлов "Openssl dgst -sha1", создающий посторонний "(stdin) =" префикс и завершающий символ новой строки Как использовать службы systemd в / usr / lib / systemd /? Нет данных xauth; используя фальшивую аутентификацию. Не удается отобразить удаленные окна Нельзя отступать heredoc, чтобы соответствовать отступу вложенности Как отправить stdout на несколько команд? Как монтировать внешний жесткий диск при каждом перезапуске сервера?

Печать из трубы 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[[[[[[[[ 

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

Если вы хотите отслеживать связь между двумя программами через канал, вы можете сделать это, вставив 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