私が持っているのは、プロセスIDとそのプロセスのファイル記述子です。そのプロセスのファイル記述子を Linux の別のプロセスで使用するために複製 (または再度開く) する sendmsg 以外の方法はありますか?
Windows にはこの目的のために DuplicateHandle がありますが、Linux にも同様のものがあるのではないかと思います。
+vonbrand が指摘したように、そのまま使用できます/proc/<pid>/fd/<fd>
。しかし、「そこに書く」ことはできず、花火はありません。
<pid>
これは、ファイル記述子としてpid を使用してプロセスで開かれるファイルへの特別なシンボリック リンクです<fd>
。
プロセスでまったく同じファイルを開くために使用するだけです。
このリンクを使用すると、プロセスが開いた元のファイルが常に表示されるため、元のファイルが削除または置換されることを心配する必要はありません。次の小さな bash コードを試してみてください。
#!/bin/bash
echo "test" >/tmp/file
ls -li /tmp/file
exec 3<> /tmp/file
rm /tmp/file
ls -lLi /proc/$$/fd/3
cat /proc/$$/fd/3
/tmp/file
これにより、文字列testを含むファイルが作成されます。ファイル記述子3としてファイルを開き、それを削除しcat
ます/proc/self/fd/3
。Linux では、プロセスがまだファイルを使用している限り、ファイルは最終的に削除されません。
したがって、プロセスのファイル記述子を取得して使用する代わりに、ファイル記述子が「指す」ファイルを開くだけです。
もちろん、そのためには権利/許可/権限が必要です。両方のプロセスを所有している場合、または root ユーザーである場合は、どちらを持っていますか。
編集: bash にない場合は、現在のプロセスに関する情報を取得する/proc/self/...
代わりに使用することもできます。/proc/$$/...
適切な権限がある場合、PID 43512 のプロセスのファイル記述子 5 は/proc/43512/fd/5
. 私はそれらをあまりいじったことがないので (のぞいてみる以外は)、そこに書いてもうまくいくか、壮大な花火ができるかもしれません。