ファイル記述子は、コンピュータのオペレーティングシステムで開いている これは、データリソースと、そのリソースへのアクセス方法を説明します。
プログラムがファイルやネットワークソケットのような別のデータリソースを開くように要求すると、カーネルは次のようにアクセスを許可します。
- は、グローバルファイルテーブルにエントリを作成します。
- は、そのエントリの場所をソフトウェアに提供します。
記述子は、0、12、または567などの一意の非負の整数で識別されます。 システム上で開いているすべてのファイルに少なくとも一つのファイル記述子が存在します。
ファイル記述子はUnixで最初に使用され、Linux、macOS、BSDなどの最新のオペレーティングシステムで使用されています。 Microsoft Windowsでは、ファイル記述子はファイルハンドルと呼ばれます。
概要
プロセスがファイルを開く要求に成功すると、カーネルはカーネルのグローバルファイルテーブル内のエントリを指すファイル記述子を返 ファイル-テーブル-エントリには、ファイルのinode、バイト-オフセット、およびそのデータ-ストリームのアクセス制限(読み取り専用、書き込み専用など)などの情報).
Stdin、stdout、およびstderr
Unixライクなオペレーティングシステムでは、最初の3つのファ/th>
ファイル記述子のリダイレクト
ファイル記述子は、linux、macOS X、およびLinux用のWindowsサブシステムのデフォルトシェルであるbashを使用して直接アクセスすることができます。たとえば、findコマンドを使用すると、成功した出力はstdout(ファイル記述子1)に送られ、エラーメッセージはstderr(ファイル記述子2)に送られます。 両方のストリームは端末出力として表示されます。
find / -name '*something*'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
findが読み取り権限のないいくつかのシステムディレクトリを検索しようとしているため、エラーが発生しています。 「許可が拒否されました」と言うすべての行はstderrに書き込まれ、他の行はstdoutに書き込まれました。ファイル記述子2を/dev/nullにリダイレクトすることで、stderrを非表示にすることができます。
find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
/dev/nullに送信されたエラーは表示されません。
stdoutとstderrの違いを理解することは、プログラムの出力を操作するときに重要です。 たとえば、findコマンドの出力をgrepしようとすると、標準出力のみがgrepにパイプされるため、エラーメッセージがフィルタリングされないことがわかります。
find / -name '*something*' | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
ただし、標準エラーを標準出力にリダイレクトすると、grepは両方のテキストを処理します。
find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
(1)にはアンパサンド(“&”)が接頭辞として付きます。 データストリームリダイレクトの詳細については、”bashシェルのパイプライン”を参照してください。bashでのファイル記述子の作成と使用の例については、exec組み込みコマンドの例を参照してください。
bashでのファイル記述子の作成と使用の例
ファイルハンドル、オペレーティングシステム用語