削除された内容 追加された内容
ArthurBot (会話 | 投稿記録)
m ロボットによる 追加: sk:Deskriptor (výpočtová technika)
m編集の要約なし
 
(19人の利用者による、間の20版が非表示)
1行目:
{{出典の明記|date=2025年9月}}
[[画像:Stdstreams-notitle.svg|thumb|right|標準入力 (stdin)、標準出力 (stdout)、標準エラー出力 (stderr) のファイル記述子の概念図]]
'''ファイル記述子'''(ファイルきじゅつし、File Descriptor)とは、[[プログラミング (コンピュータ)|プログラミング]]において[[ファイル (コンピュータ)|ファイル]]への[[参照 (情報工学)|参照]]を抽象化したキーである。'''ファイルディスクリプタ'''あるいは'''FD'''とも呼ばれる。[[Microsoft Windows]]では、「ファイルハンドル」という用語がほぼ相当するが、技術的には異なるオブジェクトである。
'''ファイル記述子'''(ファイルきじゅつし、{{lang-en|file descriptor}})とは、[[プログラミング (コンピュータ)|コンピュータプログラミング]]において[[ファイル (コンピュータ)|ファイル]]への[[参照 (情報工学)|参照]]を抽象化したキーである。'''ファイルディスクリプタ'''/'''ファイルデスクリプタ'''<ref>[https://e-words.jp/w/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF.html ファイルディスクリプタ(ファイル記述子)とは - 意味をわかりやすく - IT用語辞典 e-Words]</ref><ref>[https://www.nag-j.co.jp/nagfor/np70_manual/compiler_7_5.html NAG Fortran Compiler, Release 7.0: f90_unix_errno]</ref>あるいは'''FD'''とも呼ばれる。[[Unix系]]システムで[[テキスト端末|テキストターミナル]]を含む[[ファイル (コンピュータ)|ファイル]][[ストリーム (プログラミング)|ストリーム]]を参照する際に用いられる。
 
[[MS-DOS]]<ref>[https://www.atmarkit.co.jp/ait/articles/1404/24/news144.html MS-DOS温故知新 ~ソースコード公開を期にパソコン大衆化の原点を振り返る~:MS-DOS歴史的遺産化記念企画 - @IT]</ref>や[[Microsoft Windows]]では、「ファイルハンドル」がほぼ相当するが、技術的には異なるオブジェクトである。
 
== 概要 ==
[[POSIX]]では、ファイル記述子は[[整数]]の値であり、詳述すれ[[C言語]]の <ttcode>int</ttcode>型である。POSIXでは、全ての[[プロセス]]が持つべき3つのファイル記述子を定義している([[デーモン (ソフトウェア)|デーモン]]などはその限りではない)。
 
{| class="wikitable"
19 ⟶ 22行目:
|}
 
一般にファイル記述子は、オープン中ファイルの詳細を記録している[[カーネル]]内データ構造([[配列]])へのインデックスである。POSIXでは、これをファイル記述子テーブルと呼び、各プロセスが自身のファイル記述子テーブルを持つ。ユーザーアプリケーションは抽象キー(=ファイル記述子)を[[システムコール]]経由でカーネルに渡し、カーネルはそのキーに対応するファイルにアクセスする。アプリケーション自身はファイル記述子テーブルを直接読み書きできない。
 
[[UNIXUnix系]]システムでは、ファイル記述子がファイルだけでなく、[[ディレクトリ]]、[[ブロックデバイス]]や[[キャラクターデバイス]](スペシャルファイルとも呼ぶ)、[[ソケット (BSD)|ソケット]]、[[FIFO]]([[名前付きパイプ]])、名前なし[[パイプ (コンピュータ)|パイプ]]などの[[カーネル]]オブジェクトを汎用的に参照するのに使われる。
 
C[[標準I/OCライブラリ]]ファイルハンドル(<ttcode>FILE *</ttcode>)は技術的にはその型(ライブラリが管理するデータ構造への[[ポインタ (プログラミング)|ポインタ]](<code>FILE *</code>)がらわすものをストリームと言い{{efn|「ISO/IEC 9899:1990 §7.9 Input/output」「ISO/IEC 9899:1999 §7.19 Input/output」にそれぞれ対応す「JIS X 3010:1993 §7.9 入出力」「JIS X 3010:2003 §7.19 入出力」の中に「ハンドル」という語はない}}、POSIXではファイル記述子とストリームを包括する用語として「ハンドル」を使っている(参考: "Interaction of File Descriptors and Standard I/O Streams"{{Full|date=2019年3月}}){{efn|他Unix系仕様で、[[Network File System|NFS]]などにファイルハンドルとい用語が見られる。}}。『[[プログラミング言語C]]』第2版では<code>FILE *</code>を「ファイル・ポインタ」と呼んでいる。原著『The C Programming Language』では「file pointer」と呼んでいる。<code>FILE</code>型の実装は規格で規定されておらず、オブジェクト型(object type){{efn|C言語規格の用語であり、[[オブジェクト指向プログラミング]]のオブジェクトとは関係がい。}}であることのみが規定されているが、通例[[構造体]]でありUNIXUnix系システムでは一般に低レベルのファイル記述子(同じオブジェクトを指すもの)を含んでいる。'''これらはプラットァイルハンドル'''ォームでこのようくプログラミング言語によって標準化された上位層のコンセプトであるため、'''ファイル記述子'''と同一視はできない。
 
[[Java]]の[[Javaクラスライブラリ|標準クラスライブラリ]]には、ファイル記述子を表現するハンドルとして{{Javadoc:SE|name=java.io.FileDescriptor|java/io|FileDescriptor}}があり、主に{{Javadoc:SE|name=java.io.FileInputStream|java/io|FileInputStream}}または{{Javadoc:SE|name=java.io.FileOutputStream|java/io|FileOutputStream}}を作成するために使用される。
[[Microsoft Windows]]カーネルでは、ファイル記述子と同様であるが、より汎用的な機構によりファイルオブジェクトを含むさまざまなカーネルオブジェクトを[[ハンドル]]として識別子に関連づける枠組が採用されている。特にファイルを表すカーネルオブジェクトに関連づけられたハンドルを「ファイルハンドル」と呼ぶが、これはPOSIXにおけるファイル識別子とほぼ同等の役割を担うものと解釈することができる。このファイルハンドルは、前述のC標準ライブラリのファイルハンドルとは異なるさらに低レベルな構造を指す用語であるが、記述上は同一のため、混乱を生じることがある。
 
=== MS-DOS・Microsoft Windows ===
マイクロソフトの[[Cライブラリ|Cランタイムライブラリ (CRT)]]は、C標準I/Oライブラリとは別に、UNIX互換関数群として、ネイティブのファイルハンドルをPOSIX的な整数のファイル記述子に変換して扱う機能を持っている。
[[Microsoft Windows]]カーネルでは、ファイル記述子と同様であるが、より汎用的な機構によりファイルオブジェクトを含むさまざまなカーネルオブジェクトを[[間接参照|ハンドル]]していう抽象的な識別子に関連づける枠組が採用されている。特にファイルを表すカーネルオブジェクトに関連づけられたハンドルを「ファイルハンドル」と呼ぶが、これはPOSIXにおけるファイル識別記述子とほぼ同等の役割を担うものと解釈することができる。このファイルハンドルは、前述のC標準ライブラリのファイルハンドル{{どれ|date=2019年3月}}とは異なるさらに低レベルな構造ものを指す用語であるが、記述上は同一の語のため、混乱を生じることがある。MS-DOSではファイル記述子ほぼそのものを指して「ファイルハンドル」と呼んでいた
 
[[マイクロソフト]][[Cライブラリ|Cランタイムライブラリ (CRT)]] は、C標準I/Oライブラリとは別に、UNIXPOSIX互換関数群として、[[オペレーティングシステム]]におけるネイティブのファイルハンドルPOSIX的な整数のファイル記述子を相互変換して扱える機能を持っている<ref>[https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle _get_osfhandle | Microsoft Docs]</ref><ref>[https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open-osfhandle _open_osfhandle | Microsoft Docs]</ref>
 
==ファイル記述子に関する操作==
{{いつ範囲|date=2019年3月|最近}}UNIXUnix系システムが提供するファイル記述子関連の操作([[システムコール]]と[[ライブラリ]]関数)は以下の通りである。
 
===ファイル記述子の生成===
47 ⟶ 53行目:
* lseek(), lseek64()
* fstat(), fstat64()
* ftruncate()
* fchmod()
* fchown()
87 ⟶ 94行目:
===その他===
 
* [[ioctl]](): 一般にデバイスに対応するファイル記述子に関する様々な操作をする。
 
==ケイパビリティとしてのファイル記述子==
[[UNIX]]のファイル記述子は、一種の[[Capability-based security|ケイパビリティ]]である。sendmsg() システムコールを使うとプロセス間でファイル記述子をやり取りすることができる。つまり、UNIXのプロセスが持つファイル記述子テーブルは「ケイパビリティリスト (C-list)」の実例と見ることもできる。
 
== 脚注 ==
{{Computer-stub}}
{{脚注ヘルプ}}
=== 注釈 ===
{{Notelist}}
=== 出典 ===
{{Reflist}}
 
== 関連項目 ==
* [[ファイル (コンピュータ)]]
 
{{ファイル (コンピュータ)}}
{{Computer-stub}}
{{デフォルトソート:ふあいるきしゆつし}}
[[Category:UNIX|ふあいるきしゆつし]]
 
[[de:Handle#Datei-Handle]]
[[cs:Souborový deskriptor]]
[[de:Datei-Handle]]
[[en:File descriptor]]
[[es:Descriptor de fichero]]
[[fr:Descripteur de fichier]]
[[gl:Descritor de ficheiro]]
[[ko:파일 서술자]]
[[pl:Deskryptor pliku]]
[[pt:Descritor de arquivo]]
[[ru:Файловый дескриптор]]
[[sk:Deskriptor (výpočtová technika)]]
[[sv:Fildeskriptor]]
[[zh:文件描述符]]