Відповіді:
Безіменна труба за своєю природою є приватною для програм, що мають дескриптор файлів. Не існує принципового способу спостереження або зміни трафіку на трубі. Я також не думаю, що існує спосіб дивитися на трубу безпосередньо в Linux.
Однак існує безпринципний спосіб більш-менш робити те, що ви хочете: через системний виклик ptrace . Ви б не торкалися на трубу як такої, а на один із процесів. Для спостереження використовуйте шнур , наприклад
strace -p1234 -s99999 -e write
де 1234
ідентифікатор процесу, який пише на трубі. Змінити дані важче, але це можна зробити. Я думаю, що найпростішим способом було б спочатку встановити проміжний процес, який копіює його стандартний вхід на його стандартний вихід, плюс дані, які потрібно ввести (і мінус усі дані, які ви хочете придушити). Створіть дві названі труби та розпочніть цей проміжний процес зі stdin на одній трубі та stdout на іншій. Потім використовуйте відладчик (наприклад, GDB ), щоб змусити обидва цільові процеси виконуватись open
на відповідній названій трубці, а потім dup
розмістити трубу на відповідному дескрипторі файлу. Зауважте, що є ймовірність, що ви зламаєте один із процесів.
(Якщо ви не розумієте останній абзац, вибачте, але для цього потрібен певний рівень технічності. Я не думаю, що існує простіший спосіб.)
Деякі інструменти, корисні для спостереження за трубою:
Для вже запущеної програми, де ніхто не контролює трубопроводи, див. Метод gdb:
Перенаправлення виводу з запущеного процесу .
Або можна використовувати штрих :
strace -ewrite -p $PID 2>&1 | grep "write(1"
показує лише дескриптор 1 викликів. "2> & 1" - це перенаправити stderr на stdout, як strace записує в stderr за замовчуванням.