![別のプロセスでファイル記述子を操作する方法は? [コピー]](https://linux33.com/image/88555/%E5%88%A5%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%A8%98%E8%BF%B0%E5%AD%90%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
パスにあるアプリケーションのファイル記述子を操作(読み取り、書き込みなど)する方法はありますか?/proc/{pid}/fd
特にソケットの場合。
$ 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]
答え1
ptrace()
技術的に/を使用すると、ほぼすべてが可能ですgdb
。 検索結果。
使用法はptrace()
アーキテクチャによって異なり、厄介であり、AFAICTは誰もそれを実装しません。広く使用されているアプリケーションはfdをプロセスに注入することですが、これは望むものとは反対です。
何が必要かを考えてみると痛みを感じました。
gdbスクリプトメソッドを使用してソースコードを表示できますフィルター。 gdb内でFDを通信することは依然として非常に厄介です。 fdと通信する方法は、sendmsg()
Unixソケットを介して「セカンダリデータ」に送信することです。
残念ながら、補助データ転送は通常マクロを使用して行われる。 Cインタプリタは印象的ですが、gdb
マクロを使用することは不可能だと思います。
fdsを渡すもう1つの方法はを使用することですfork()
。したがって、これは少し簡単なオプション(と一緒に使用exec()
)を提供できます。残念ながら、親友ではptrace()
ないようです。fork()
いくつかありますLinux固有のgdbコマンドこれは操作を完了することができますが、ブレークポイントのサポートのみを参照し、gdbコマンドを操作できるかどうかについては言及しませんcall fork()
。うまくいっても台無しにする必要があるかもしれませんFD_CLOEXEC
(close-on-exec)。これもマクロです。
単純なマクロの値を見つけることは難しくありません(screenifyが書かれた方法です)。セカンダリデータを転送するためのマクロインタフェースはあまり複雑ではないので、リバースエンジニアリングする方が簡単です。