/proc/[pid]/fd/[0, 1, 2]: 対応するファイルやデバイスがありません - ファイルが存在しても

/proc/[pid]/fd/[0, 1, 2]: 対応するファイルやデバイスがありません - ファイルが存在しても

stdio親プロセスの外部からプロセスのストリームにアクセスしようとしています。ディレクトリを見つけ/proc/[pid]/fdましたが、試してみると

$ cat /proc/[pid]/fd/1

エラーが発生しますNo such file or device。 Dolphin(ファイルブラウザ)が示すように、私はそれが存在すると確信しています。

私はまた、ファイルエクスプローラが次のようにリストされていることを発見しました。ソケット提案どおりにお読みください。ここ同様のエラーが発生します。stdioストリームは通常ソケットではなくパイプなので、ここで何が起こっているのかわかりません。

sudoまた、これらのプロセスは同じユーザーによって開始され、それにアクセスしようとしても機能しないことを指摘したいと思います。この質問が無邪気に見えた場合はお詫び申し上げます。でもアドバイスをしてくださったら心から感謝します。 stdioパイプにアクセスするより良い方法がありますか?

答え1

長すぎる博士。2020年現在/proc/<pid>/fd/<fd>ソケットの場合は、このタスク(または同様のタスク)を実行できません。

プロセスのstdin、stdout、およびstderrは、パイプ、通常のファイルなどではなく、任意の種類のファイルにすることができます。ソケットになることもできます。

Linuxでは、/proc/<pid>/fd/<fd>以下を開くことができる特別なシンボリックリンクです。最初から始めましょうこれは、ファイルが削除された場合やファイルシステムにまったく存在しない場合(たとえば、生成されたファイルを使用する場合)、ファイルmemfd_create(2)記述子が参照する物理ファイルに対して行われます。

しかし、ソケットは注目すべき例外であり、この方法で開くことはできません。 (そしてそれを実装する方法は明確ではありません。対応するfdが接続されたソケットの場合、サーバーへの別の接続を作成しますか?ソケットは明示的open()/proc/<pid>/fd/<fd>ローカルポートですか?)。

最新バージョンのLinuxカーネルでは、新しいシステムコールが導入されました。pidfd_getfd(2)これは、Unixソケットを介してファイル記述子を渡すことができるように、他のプロセスからファイル記述子を「盗む」ことができますが、被害者プロセスの協力なしに可能です。しかし、これはまだほとんどのLinuxディストリビューションでは実装されていません。

関連情報