ファイル記述子リンクの移植性

ファイル記述子リンクの移植性

私はいつもこれが気になりましたが、それを見つけるのに時間を費やしていませんでした。だからここにあります - 使い方がどのくらい移植性があるかここに表示または/proc/$$/fd/$Nそれとも/dev/fd/$NPOSIX保証 /dev/null, /dev/tty, and /dev/console (前回コメントを見るまでは知りませんでしたが、この回答)しかし、他の人はどうですか?

私が知っている限り、これらの現象は非常に一般的ですが、どのシステムでこれを実行できますか?いいえそれらを見つけることが期待されますか?なぜできないの?他のものより1つを見つける可能性は高いですか?彼らはいつも似たような特性を持っていますか?

私はこれらのデバイスをさまざまな方法で広く使用する傾向がありますが、使用するのが難しいのではないかと思います。

また、上記の質問は完全に私の問題として理解されるべきです。考える知りたいのですが、当然最初に聞かなければならない部分なので、私がこの分野について最も知識がないかもしれないので、答えのための厳格な要件として受け入れてはいけません。可能であれば教えてください。

ベストアンサー1

これらのシンボリックリンクはLinuxではほとんど普遍的ですが、他には存在しません(これをエミュレートするCygwinを除く)。 AIXおよびSolarisにも存在しますが、シンボリックリンクではありません。開いているファイルに関する情報を取得するには。/proc/PID/fd/NUM/proc/PID/fd/NUMlsof

そして/proc/PID/fd

Linux

Linuxでは、IDを持つプロセスファイルを指す少し魔法のようなシンボリックリンクです。/proc/PID/fd/NUMPIDファイル記述子が開いています。シリアル番号。このリンクは魔法であり、たとえばファイルが削除された場合でもファイルにアクセスするために使用できます。このリンクは、名前変更によってファイルも追跡します。/proc/self以下を指す魔法の象徴的なリンクです。/proc/PIDPIDリンクに接続するプロセスです。

この機能はほぼすべてのLinuxシステムに存在します。ドライバーが提供するものですプロセスファイルシステム、これは技術的にオプションですが、あまりにも多くの作業(ps読み込みジョブの作成を含む)に使用されるため、組み込みシステムでもほとんど欠けていません。/proc/PID

シビン

CygwinはLinux(Cygwinプロセス用)と。/proc/PID/fd/NUM/proc/self

ソラリス(バージョン2.6以降)、X

各ファイル記述子のエントリがありますが、開いているファイルと同じタイプで表示されるため、ファイルパスに関する情報は提供されません。しかし彼らは同じ内容を報告しました。/proc/PID/fdstat情報はfstatファイルを開いたプロセスが報告されるので、ファイルが存在するファイルシステムとそのinode番号を確認できます。ディレクトリはシンボリックリンクとして表示されますが、従うだけで空のreadlink文字列を返すことができる魔法のシンボリックリンクです。

AIXではprocfilesこのコマンドは、プロセスによって開かれたファイルに関するいくつかの情報を表示します。ソラリスではpfilesこのコマンドは、プロセスによって開かれたファイルに関するいくつかの情報を表示します。これにはファイルパスは含まれません(SolarisではSolaris 10から始まります。以下を参照)。

ソラリス(からバージョン10)

さらに、最新の Solaris バージョンには、Linux に似たシンボリックリンクが含まれています。これ/proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfilesこのコマンドは、パスを含むプロセスのオープンファイルに関する情報を表示します。

計画9

/proc/PID/fdプロセスで開かれた各ファイル記述子の1つのレコード(行)を含むテキストファイル。ファイル名は追跡されません。

QNX

/proc/PID/ディレクトリですが、ファイル記述子に関する情報は含まれません。

Unicesは/procファイル記述子に直接アクセスできますが、直接アクセスすることはできません。

(注:時にはアクセス可能なメモリイメージを検索してプロセスで開いたファイルに関する情報を取得することができます。/proc私はこの「直接アクセス」を考慮しません。)

Unicesファイルはどこにありますか?/proc/PID

procファイルシステム自体スタートUNIX バージョン 8 では構造が異なりますが、Plan 9 を経て一部の unice に戻りました。 PIDを持つすべてのオペレーティングシステムには/proc各PIDのエントリがありますが、多くのシステムではディレクトリではなく一般的なファイルです。次のシステムには、読み取る必要があるシステムがあります。/proc/PIDioctl

  • ソラリスガンダム2.5
  • これでOSF / 1が呼び出されます。トゥルー64
  • エリックス(?)
  • SCO(?)

ミニ3

MINIX 3ではプロセスサーバーディレクトリを含むいくつかのLinuxに似たコンポーネントを提供します。しかし。/proc/PID//proc/PID/fd

FreeBSD

FreeBSD にはディレクトリがありますが、開いたファイル記述子に関する情報は提供しません。 (しかし、シンボリックリンクを介して実行可能ファイルにアクセスできるLinuxに似たものがあります。)/proc/PID//proc/PID/file/proc/PID/exe

FreeBSDのprocfsは次のとおりです。廃止

統一はありません。/proc

  • HP-UX
  • オープンBSD
  • ネットワークBSD
  • Mac OS X

別のチャンネルからファイル記述子情報を取得する

フューザー

これfuserこのコマンドは、指定されたマウントポイントで指定されたファイルを開くプロセスをリストします。これは標準コマンドです(すべてのコマンドに適用されます)。XSI- 互換性のあるシステム(例:X / Openシステムインターフェース拡張を含むPOSIX)

このユーティリティを使用してプロセス名からファイル名に移動することはできません。

Lsof は「開いているファイルのリスト」を表します。これはサードパーティ製ツール、ほとんどのUNIXバリアントで使用できます(ただし、通常はデフォルトのインストールには含まれていません)。開いているファイルに関する情報を取得することは、上記の分析によって疑わしいことがあるため、システムによって非常に異なります。 lsof管理者は、これらすべてを1つのインターフェースにまとめる優れた作業を行いました。

あなたは読むことができますよくある質問LSofがどんな困難に耐えるべきかを見てください。ほとんどの unice で開かれたファイルの名前に関する情報を取得するには、カーネルのデータ構造を解析する必要があります。 FAQ 3.3「lsofがフルパス名を報告しないのはなぜですか?」引用:

Lsof は、次の方言に対してカーネル名キャッシュからパス名コンポーネントを取得できません。

  • X

Linuxカーネルのみが開いたファイルのために維持する構造体にフルパス名を記録します。代わりに、ほとんどのカーネルはパス名をデバイスとノード番号の二重文字に変換し、ファイルを開いた後の後続のファイル参照に使用します。

lsofの出力から情報を解析する必要がある場合は、-Fパターン(1行に1つのフィールド)を使用する必要があり、パターン-F0(ヌルで区切られたフィールド)を使用することをお勧めします。特定のプロセスの特定のファイル記述子に関する情報を取得するには、たとえば、-aオプションを使用します。-p PID-d NUMlsof -a -p 123 -d 0 -F0n

/dev/fd/NUM現在のプロセスのファイル記述子

多くのUNIXバリアントは、プロセスがファイル名で開かれたファイルにアクセスする方法を提供します。 open は呼び出しと同じです。/dev/fd/NUMdup(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
  • ほとんどのUNIX(アイリックスオープンBSDネットワークBSD、SCO、ソラリス、… )の項目は/dev/fd文字デバイスです。通常、ファイルディスクリプタが開いているかどうかに関係なく表示され、特定の数以上のファイルディスクリプタに対してエントリを使用できない場合があります。
  • FreeBSDとOSXではfdescfsファイルシステムは、/dev/fd呼び出しプロセスのオープン記述子に従う動的ディレクトリを提供します。インストールされていない場合は/dev/fd静的に使用できます。/dev/fd
  • OSF / 1(Tru64)は以下を/dev/fd提供します。FDFS
  • /dev/fdAIXまたはHP-UXでは使用できません。

おすすめ記事