これを行うと(Bourneのようなシェルで):
exec 3> file 4>&3 5> file 6>> file
ファイル記述子 3 と 4 は、3dup()
から 4 が編集されているため、同じことを共有します。ファイル説明を開く(同じ属性、ファイル内の同じオフセット...)。プロセスのファイル記述子5と6は別の場所にありますが、ファイル説明を開く(たとえば、すべてのファイルに独自のポインタがあります。)
これでlsof
出力で見ることができる内容は次のとおりです。
zsh 21519 stephane 3w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 4w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 5w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 6w REG 254,2 0 10505865 /home/stephane/file
次の方法を使用することをお勧めしますlsof +fg
。
zsh 21519 stephane 3w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 4w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 5w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 6w REG W,AP,LG 254,2 0 10505865 /home/stephane/file
(Linux 3.16では)fd 6には異なるフラグがあるため、異なる必要があります。ファイル説明を開く1つはfd 3、4、または5にありますが、これではfd 5が別の場所にあることはわかりません。ファイル説明を開く。を使用すると-o
オフセットも表示できますが、同じオフセットが同じであることを保証するものではありません。ファイル説明を開く。
非侵襲的に把握する方法はありますか?外部ですか、それともプロセス自体のファイル記述子ですか?
1. 1 つの経験的な方法は、1 つのファイル記述子のフラグを変更fcntl()
し、結果として別のファイル記述子のフラグが更新されることを確認することですが、これは確かに理想的または完全な方法ではありません。
ベストアンサー1
Linux 3.5以降では、次のことができます。kcmp(2):
KCMP_FILE
マニュアルページは、OPが要求したユースケースの具体的な例を提供します。このシステムコールを実行するには、カーネルをsetにコンパイルする必要がありますCONFIG_CHECKPOINT_RESTORE
。