私はいつもこれを不思議に思っていましたが、見つけるのに時間がかからなかったので、今からそうします–ここに示されている/proc/$$/fd/$N
の使用法はどれほど移植性がありますか または/dev/fd/$N
? POSIXが/dev/null, /dev/tty, and /dev/console
を保証することを理解しています (この回答のコメントを読んだ後、先日それを見つけただけですが) しかし、これらの他のものはどうですか?
私が知る限り、それらはかなり一般的ですが、どのシステムでできない それらを見つけることを期待しますか?なぜだめですか?どちらか一方を見つける可能性が高いですか?それらは常に同じような属性を示しますか?
私はこれらのデバイスをあらゆる方法でかなり広範囲に使用する傾向があります。試してみるだけで足りなくなる可能性があるかどうかを知りたいのです。
また、上記の質問は、私が考えているものにすぎないと理解する必要があります。 知りたいのですが、そもそも質問しなければならないので、よくわからないかもしれませんし、厳しい答えの要件とは言えません。できれば手がかりを教えてください。
承認された回答:
/proc/PID/fd/NUM
シンボリックリンクはLinuxでは準ユニバーサルですが、他の場所には存在しません(それらをエミュレートするCygwinを除く)。 /proc/PID/fd/NUM
AIXとSolarisにも存在しますが、これらはシンボリックリンクではありません。移植性のある、開いているファイルに関する情報を取得するには、lsof
をインストールします 。
/proc/PID/fd
Linux
Linuxでは、/proc/PID/fd/NUM
ID PIDのプロセスが処理するファイルへのわずかに魔法のシンボリックリンクです。 ファイル記述子NUMで開いています 。このリンクは、たとえば、ファイルが削除された場合でもファイルにアクセスするために使用できるという点で魔法です。リンクは、名前の変更によってもファイルを追跡します。 /proc/self
/proc/PID
ここで、 PID リンクにアクセスするプロセスです。
この機能は、事実上すべてのLinuxシステムに存在します。これは、procファイルシステムのドライバーによって提供されます。これは、技術的にはオプションですが、非常に多くの目的で使用されます(ps
の作成を含む)。 動作— /proc/PID
)組み込みシステムでもほとんど取り残されていないこと。
Cygwin
CygwinはLinuxの/proc/PID/fd/NUM
(Cygwinプロセスの場合)および/proc/self
。
Solaris(バージョン2.6以降)、AIX
/proc/PID/fd
各ファイル記述子のエントリですが、開いているファイルと同じタイプとして表示されるため、ファイルのパスに関する情報は提供されません。ただし、同じstat
を報告します fstat
としての情報 ファイルが開いているプロセスにレポートするため、ファイルが配置されているファイルシステムとそのiノード番号を判別できます。ディレクトリはシンボリックリンクとして表示されますが、フォローすることしかできない魔法のシンボリックリンクであり、readlink
空の文字列を返します。
AIXでは、procfiles
コマンドは、プロセスの開いているファイルに関するいくつかの情報を表示します。 Solarisでは、pfiles
コマンドは、プロセスの開いているファイルに関するいくつかの情報を表示します。これにはファイルへのパスは含まれません(Solarisでは、Solaris 10以降に含まれます。以下を参照してください)。
Solaris(バージョン10以降)
/proc/PID/fd/NUM
、最新のSolarisバージョンには/proc/PID/path/NUM
これには、/proc/PID/fd/NUM
。 pfiles
コマンドは、パスなど、プロセスの開いているファイルに関する情報を表示します。
Plan9
/proc/PID/fd
プロセスによって開かれたファイル記述子ごとに1つのレコード(行)を含むテキストファイルです。ファイル名はそこで追跡されません。
QNX
/proc/PID/
はディレクトリですが、ファイル記述子に関する情報は含まれていません。
/proc
との統合 ただし、ファイル記述子に直接アクセスすることはできません
(注:/proc
でアクセスできるメモリイメージをリフリングすることで、プロセスの開いているファイルに関する情報を取得できる場合があります。 。それを「直接アクセス」とは見なしません。)
/proc/PID
ファイルです
procファイルシステム自体はUNIX第8版で始まりましたが、構造が異なり、Plan 9を経て、いくつかのユニスに戻りました。 /proc
を備えたすべてのオペレーティングシステムだと思います 各PIDのエントリがありますが、多くのシステムでは、ディレクトリではなく通常のファイルです。次のシステムには/proc/PID
ioctl
で読み取る必要があります :
- 最大2.5のSolaris
- OSF/1は現在Tru64として知られています
- IRIX(?)
- SCO(?)
MINIX 3
MINIX 3には、/proc/PID/
ディレクトリ。ただし、/proc/PID/fd
。
FreeBSD
FreeBSDには/proc/PID/
ディレクトリですが、開いているファイル記述子に関する情報は提供しません。 (ただし、/proc/PID/file
これはLinuxの/proc/PID/exe
、シンボリックリンクを介して実行可能ファイルへのアクセスを許可します。)
FreeBSDのprocfsは廃止されました。
/proc
のないユニス
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
他のチャネルを介したファイル記述子情報
フューザー
fuser
コマンドは、指定されたファイルが開いているプロセス、または指定されたマウントポイントでファイルが開いているプロセスを一覧表示します。このコマンドは標準です(すべてのXSI準拠システム、つまりX / Open System InterfaceExtensionを備えたPOSIXで使用できます)。
このユーティリティを使用して、プロセスからファイル名に移動することはできません。
Lsof
Lsofは、「開いているファイルのリスト」の略です。これはサードパーティのツールであり、ほとんどのUNIXバリアントで利用できます(ただし、通常はデフォルトのインストールの一部ではありません)。上記の分析で疑わしいかもしれないので、開いているファイルに関する情報の取得はシステムに大きく依存します。 lsofメンテナは、すべてを1つのインターフェイスで組み合わせる作業を行いました。
FAQを読んで、lsofがどのような困難に耐えなければならないかを確認できます。ほとんどのユニスでは、開いているファイルの名前に関する情報を取得するには、カーネルデータ構造を解析する必要があります。 FAQ 3.3「lsofがフルパス名を報告しないのはなぜですか?」からの引用:
Lsofは、次の方言のカーネル名キャッシュからパス名コンポーネントを取得できません。
- AIX
Linuxカーネルのみが、開いているファイルに関して維持している構造にフルパス名を記録します。代わりに、ほとんどのカーネルはパス名をデバイスとノード番号のダブレットに変換し、ファイルが開かれると、それらを後続のファイル参照に使用します。
lsof
からの情報を解析する必要がある場合 の出力、必ず-F
を使用してください モード(1行に1フィールド)、できれば-F0
モード(nullで区切られたフィールド)。特定のプロセスの特定のファイル記述子に関する情報を取得するには、-a
を使用します -p PID
および-d NUM
、例: lsof -a -p 123 -d 0 -F0n
。
/dev/fd/NUM
現在のプロセスのファイル記述子の場合
多くのUNIXバリアントは、プロセスがファイル名を介して開いているファイルにアクセスする方法を提供します。opening/dev/fd/NUM
dup(NUM)
。これらの名前は、プログラムがファイル名を必要としているが、すでに開いているファイル(パイプやソケットなど)を渡したい場合に役立ちます。たとえば、プロセス置換を実装するシェルは、可能な場合はそれらを使用します(/dev/fd
の一時的な名前付きパイプを使用) 利用できません。
/dev/fd
の場所 存在する場合、通常(常に?)同義語もあります(シンボリックリンク、ハードリンク、同等のプロパティを持つマジックファイル)/dev/stdin
=/dev/fd/0
、/dev/stdout
=/dev/fd/1
、/dev/stderr
=/dev/fd/2
。
- Linuxでは、
/dev/fd
/proc/self/fd
へのシンボリックリンクです 。 - ほとんどのユニス(IRIX、OpenBSD、NetBSD、SCO、Solarisなど)では、
/dev/fd
のエントリ キャラクターデバイスです。これらは通常、ファイル記述子が開いているかどうかに関係なく表示され、特定の数を超えるファイル記述子のエントリは使用できない場合があります。 - FreeBSDおよびOSXでは、fdescfsファイルシステムは動的な
/dev/fd
を提供します。 呼び出しプロセスのオープン記述子に続くディレクトリ。静的な/dev/fd
/dev/fd
の場合に利用可能です マウントされていません。 - OSF / 1(Tru64)では、
/dev/fd
fdfsを介して提供されます。 -
/dev/fd
はありません AIXまたはHP-UXの場合。