
Gibt es eine Möglichkeit, einen Dateideskriptor für eine beliebige App, die im Pfad gefunden werden kann, zu manipulieren (lesen, schreiben usw.) ?/proc/{pid}/fd
Speziell für Steckdosen.
$ ll /proc/4229/fd
total 0
lrwx------. 1 vagrant vagrant 64 May 18 01:10 0 -> socket:[34147]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 1 -> socket:[34149]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 10 -> /dev/null
lrwx------. 1 vagrant vagrant 64 May 18 01:10 11 -> socket:[34943]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 13 -> socket:[34945]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 14 -> socket:[34948]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 15 -> socket:[34950]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 2 -> socket:[34151]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 3 -> socket:[34153]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 4 -> pipe:[34155]
l-wx------. 1 vagrant vagrant 64 May 18 01:10 5 -> pipe:[34155]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 6 -> anon_inode:[eventpoll]
lr-x------. 1 vagrant vagrant 64 May 18 01:10 7 -> pipe:[34156]
l-wx------. 1 vagrant vagrant 64 May 18 01:10 8 -> pipe:[34156]
lrwx------. 1 vagrant vagrant 64 May 18 01:10 9 -> anon_inode:[eventfd]
Antwort1
Technisch ist mit ptrace()
/ fast alles möglich gdb
. Suchergebnisse.
Die Verwendung ptrace()
ist architekturabhängig, umständlich und meines Wissens hat es niemand für Sie implementiert. Die beliebte Anwendung besteht darin, ein fd in den Prozess einzufügen, aber das ist ungefähr das Gegenteil von dem, was Sie wollen.
Ich habe darüber nachgedacht, was erforderlich wäre, und es sieht sehr schmerzhaft aus.
Sie können den gdb-Skriptansatz verwenden und sich den Quellcode von ansehenScreenify - Bildschirmanzeige. Es ist wahrscheinlich immer noch sehr umständlich, FDs aus gdb heraus zu kommunizieren. Die Art und Weise, wie Sie FDs kommunizieren, besteht darin, sie als „Zusatzdaten“ sendmsg()
über einen Unix-Socket zu senden.
Leider erfolgt das Senden von Zusatzdaten normalerweise mithilfe eines Makros. Obwohl gdb
es einen erstaunlichen Eindruck eines C-Interpreters macht, glaube ich nicht, dass es möglich ist, Makros zu verwenden.
Die andere Möglichkeit, FDS zu übergeben fork()
, ist die Verwendung von , was einige etwas einfachere Optionen bieten könnte (in Kombination mit exec()
). Leider sieht es so aus, als wären ptrace()
und fork()
nicht die besten Freunde. Es gibt einigeLinux-spezifische GDB-Befehledas könnte funktionieren, aber es erwähnt nur die Unterstützung für Haltepunkte; es sagt nicht, ob Sie den gdb-Befehl call fork()
sinnvoll zum Laufen bringen können. Selbst wenn es funktioniert, müssen Sie möglicherweise auch mit (close-on-exec) herumspielen FD_CLOEXEC
. Das ist auch ein Makro.
Es ist nicht allzu schwer, den numerischen Wert eines einfachen Makros zu finden (so wurde Screenify geschrieben). Die Makroschnittstelle zum Senden zusätzlicher Daten ist nicht sehr kompliziert, daher ist es möglicherweise einfacher, dies zurückzuentwickeln.