Antworten:
Eine namenlose Pipe ist von Natur aus privat für die Anwendungen, die den Dateideskriptor haben. Es gibt keine prinzipielle Möglichkeit, den Verkehr auf der Pipe zu beobachten oder zu ändern. Ich glaube auch nicht, dass es eine Möglichkeit gibt, die Pipe direkt unter Linux zu betrachten.
Es gibt jedoch eine prinzipienlose Möglichkeit, mehr oder weniger das zu tun, wonach Sie suchen : über den Aufruf des ptrace- Systems. Sie würden nicht an sich auf das Rohr heften, sondern auf einen der Prozesse. Verwenden Sie zur Beobachtung Strace , z
strace -p1234 -s99999 -e write
Wo 1234
ist die Prozess-ID eines Prozesses, der in die Pipe schreibt? Das Ändern der Daten ist schwieriger, kann jedoch durchgeführt werden. Ich denke, der einfachste Weg wäre, zuerst einen Zwischenprozess einzurichten, der seine Standardeingabe in seine Standardausgabe kopiert, plus die Daten, die Sie einfügen möchten (und abzüglich aller Daten, die Sie unterdrücken möchten). Erstellen Sie zwei Named Pipes und starten Sie diesen Zwischenprozess mit stdin auf einem Pipe und stdout auf dem anderen. Verwenden Sie dann einen Debugger (z. B. GDB ), um beide Zielprozesse open
auf der entsprechenden Named Pipe auszuführen , und dup
platzieren Sie die Pipe dann auf dem entsprechenden Dateideskriptor. Beachten Sie, dass möglicherweise einer der Prozesse in diesem Prozess abstürzt.
(Wenn Sie den letzten Absatz nicht verstehen, tut es mir leid, aber es erfordert ein gewisses Maß an Technik. Ich glaube nicht, dass es einen einfacheren Weg gibt.)
Einige nützliche Tools zur Überwachung eines Rohrs:
Informationen zu einem bereits laufenden Programm, bei dem die Rohrleitungen nicht gesteuert werden, finden Sie in der gdb-Methode:
Umleiten der Ausgabe eines laufenden Prozesses .
Oder man kann strace verwenden :
strace -ewrite -p $PID 2>&1 | grep "write(1"
zeigt nur Deskriptor 1-Aufrufe an. "2> & 1" leitet stderr nach stdout um, da strace standardmäßig nach stderr schreibt.