別のプロセスでファイル記述子を操作するにはどうすればいいですか?

別のプロセスでファイル記述子を操作するにはどうすればいいですか?

パス内にある任意のアプリのファイル記述子を操作 (読み取り、書き込みなど) する方法はありますか?/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 ソケットを使用してそれらを「補助データ」として送信することです。

残念ながら、補助データの送信は通常、マクロを使用して行われます。Cgdbインタープリタの素晴らしい印象を与えますが、マクロを使用することはできないと思います。

fd を渡すもう 1 つの方法は を使用することですfork()。これにより、 と組み合わせて、若干簡単なオプションが提供される場合がありますexec()。残念ながら、ptrace()と はfork()ベスト フレンドではないようです。Linux 固有の gdb コマンドこれでうまくいくかもしれませんが、ブレークポイントのサポートについてのみ言及されています。gdb コマンドがcall fork()適切に機能するかどうかについては言及されていません。機能する場合でも、(close-on-exec) も調整する必要があるかもしれませんFD_CLOEXEC。これもマクロです。

単純なマクロの数値を見つけるのはそれほど難しくありません (screenify はこのように書かれています)。補助データを送信するためのマクロ インターフェイスはそれほど複雑ではないので、代わりにそれをリバース エンジニアリングする方が簡単かもしれません。

関連情報