別のプロセスでファイル記述子を操作する方法は? [コピー]

別のプロセスでファイル記述子を操作する方法は? [コピー]

パスにあるアプリケーションのファイル記述子を操作(読み取り、書き込みなど)する方法はありますか?/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が書かれた方法です)。セカンダリデータを転送するためのマクロインタフェースはあまり複雑ではないので、リバースエンジニアリングする方が簡単です。

おすすめ記事