GNU/Linux >> Linux の 問題 >  >> Linux

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

私はいつもこれを不思議に思っていましたが、見つけるのに時間がかからなかったので、今からそうします–ここに示されている/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/NUMpfiles コマンドは、パスなど、プロセスの開いているファイルに関する情報を表示します。

Plan9

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

関連:awkプログラムのパスからファイル名を抽出しますか?

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の場合。
関連:ANSIエスケープコードを使用してターミナルカーソルで文字を取得することは可能ですか?
Linux
  1. スクリプト実行時の重複したcronジョブの管理

  2. Linux ファイル システムのソフト リンクとハード リンクとは

  3. ファイル ポインタ ( FILE* fp ) をファイル記述子 (int fd) に変換するにはどうすればよいですか?

  1. Linux の最大 PID

  2. .pid ファイルとは何ですか? また、何が含まれていますか?

  3. <service-name> は停止していますが、pid ファイルは存在します

  1. cp -L 対 cp -H

  2. ファイル記述子を強制的に閉じる最も安全な方法

  3. 特定のプロセスの .pid ファイルを見つける方法