ufdcreate カーネル・サービス

目的

ファイル記述子を割り振り、初期化します。

構文

#include <fcntl.h>
#include <sys/types.h>
#include <sys/file.h>
int ufdcreate (flags, ops, datap, type, fdp, cnp)
int  flags;
struct fileops * ops;
void * datap;
short  type;
int * fdp;
struct ucred *crp;

パラメーター

項目 説明
flags ファイル 構造体に保管するフラグを指定します。 file 構造は、 sys/file.h ファイルに定義されます。 このルーチンによって返されたファイル・ディスクリプターを使用して 読み取り または 書き込み サブルーチンを呼び出す場合は、 読み取り フラグと 書き込み フラグを適切に設定する必要があります。 有効なフラグは、 fcntl.h ファイルに定義されています。
ops ファイル・システム操作 (読み取り/書き込み、ioctl、選択、fstat、およびクローズ) のために呼び出すサブシステム提供ルーチンのリストを指します。 fileops 構造体は、 sys/file.h ファイルで定義されます。 詳しくは、 "ファイル操作" を参照してください。
データ・セット タイプ依存構造体を指します。 システムは、このポインターを ファイル 構造体に保管します。 結果として, ファイル操作が呼び出された時に, その操作にポインターを使用することができます。
type ファイル 構造体の固有のタイプ値を指定します。 有効なタイプは、 sys/file.h ファイルにリストされています。
FDP 正常な戻り時にファイル記述子が保管される整数フィールドを指します。
CRP 資格情報構造を指します。 このポインターは, 後続の操作で使用するためにファイル構造に保管されます。 有効な 粘液 構造体でなければなりません。 CRREF () カーネル・サービスを使用して、 粘液 構造体を取得できます。

説明

ufdcreate カーネル・サービスは、カーネル・エクステンションへのファイル・インターフェースを提供します。 カーネル・エクステンションは、このサービスを使用して、ファイル・ディスクリプターとファイル構造のペアを作成します。 また、このサービスを使用すると、カーネル・エクステンションは、独自のファイル・ディスクリプター・ベースのシステム・コールを提供して、ファイル・システム外部のオブジェクトに対する読み取り/書き込み、ioctl、選択、fstat、およびクローズ操作を使用可能にすることができます。 ufdcreate カーネル・サービスは、論理ファイル・システム (LFS) の同期要件を理解したり、それに準拠したりするために拡張機能を必要としません。

ufdcreate カーネル・サービスは、呼び出し元にファイル記述子を提供し、基礎となるファイル構造を作成します。 呼び出し側は、読み取り/書き込み、ioctl、選択、fstat、およびクローズ操作のために、サブシステム提供ルーチンへのポインターを組み込む必要があります。 呼び出し側サブシステムがいずれかの操作を必要としない場合、呼び出し側は適切な エラー番号 値へのポインターを提供する必要があります。 通常、この目的には EOPNOUPP (EOPNOTSUPP) 値が使用されます。 サブシステム提供ルーチンの要件については、 "ファイル操作" を参照してください。

ファイル記述子の除去

ufdcreate カーネル・サービスによって作成されたファイル記述子 (および付随する構造) を除去するための、対応する操作はありません。 ファイル・ディスクリプターを除去するには、 閉じる サブルーチンへの呼び出しを使用します。 閉じる サブルーチンは、ルーチンから、またはカーネルまたはカーネル・エクステンション内から呼び出すことができます。 クローズが呼び出されない場合は、プロセスの終了時にファイルがクローズされます。

ufdcreate カーネル・サービスへの呼び出しが行われると、サービスへの呼び出しが戻る前に、ファイル記述子はオープンしていると見なされます。 閉じる または 出口 サブルーチンが呼び出されると、 ufdcreate インターフェースへの呼び出しで指定されたファイル・クローズ操作が呼び出されます。

ファイル操作

ufdcreate カーネル・サービスにより、カーネル・エクステンションは独自のファイル・ディスクリプター・ベースのシステム・コールを提供し、ファイル・システム外部のオブジェクトに対する読み取り/書き込み、ioctl、選択、fstat、およびクローズ操作を可能にします。 sys/file.h ファイルに定義されている fileops 構造体は、これらのルーチンのインターフェースを提供します。

読み取り/書き込み要件

読み取り/書き込み操作は、 FP パラメーターで指定されたオブジェクトへの入出力を管理します。 この操作によって実行されるアクションは、オブジェクト・タイプによって異なります。 操作の構文は次のとおりです。

#include <sys/types.h>
#include <sys/uio.h>
int (*fo_rw) (fp, rw, uiop, ext)
struct file *fp;
enum uio_rw rw;
struct uio *uiop;
int ext;

パラメーターには、以下の値があります。

説明
fp ファイル 構造体を指します。 この構造体は、 読み取り または 書き込み サブルーチンで使用されるファイル・ディスクリプターに対応します。
rw 読み取り操作の場合は UIO 読み取り 値、書き込み操作の場合は 入出力書き込み 値が入ります。
UIOP UIO 構造体を指します。 この構造体は、要求された入出力の場所とサイズの情報を記述します。 uio 構造体は、 uio.h ファイルに定義されています。
エクステンド サブシステム依存情報を指定します。 Readx または ライトックス サブルーチンを使用すると、操作によって渡される値がこのサブルーチンに渡されます。 それ以外の場合、値は 0です。

正常に実行された場合、 発泡スチロール 操作は値 0 を戻します。 ゼロ以外の戻り値は、エラーを示すようにプログラムする必要があります。 可能な値のリストについては、 sys/errno.h ファイルを参照してください。

注: 正常な戻り時には、uiop->uio_residフィールドを更新して、実際に転送されたデータのバイト数を含める必要があります。

ioctl の要件

ioctl 操作は、オブジェクト依存の特殊コマンド処理を提供します。 Ioctl サブルーチンは、指定されたオープン ファイル 構造体に関連したオブジェクトに対してさまざまな制御操作を実行します。 このサブルーチンは通常、文字特殊ファイルまたはブロック特殊ファイルで使用され、通常のファイルの場合はエラーを返します。

ioctl 操作によって提供される制御操作は、 引数 パラメーターのデータ・タイプおよび内容と同様に、アドレス指定されるオブジェクトに固有のものです。

ioctl 操作の構文は、次のとおりです。

#include <sys/types.h>
#include <sys/ioctl.h>
int (*fo_ioctl) (fp, cmd, arg, ext, kflag)
struct file *fp;
int cmd, ext, kflag;
caddr_t arg; 

パラメーターには、以下の値があります。

説明
fp ファイル 構造体を指します。 この構造体は、 Ioctl サブルーチンによって使用されるファイル・ディスクリプターに対応します。
cmd このルーチンによって処理される特定の要求を定義します。
ARG CMD パラメーターに依存するデータが含まれます。
エクステンド サブシステム固有の情報を指定します。 IoctlX サブルーチンが使用される場合、アプリケーションによって渡される値がこのサブルーチンに渡されます。 それ以外の場合、値は 0です。
KFLAG 呼び出しをどこから行うかを決定します。 このルーチンが fp_ioctl インターフェースを介して呼び出される場合、 kflag パラメーターの値は FKERNEL ( fcntl.h ファイルから) になります。 それ以外の場合、その値は 0 です。

正常に実行された場合、 フォイオクトル 操作は値 0 を戻します。 エラーの場合、 フォイオクトル 操作は、エラーを示すゼロ以外の戻り値を戻す必要があります。 可能な値のリストについては、 sys/errno.h ファイルを参照してください。

要件の選択

選択操作は、 FP パラメーターで指定されたオブジェクトに対して選択操作を実行します。 この操作の構文は次のとおりです。

#include <sys/types.h>
int (*fo_select) (fp, corl, reqevents, rtneventsp, notify)
struct file *fp;
int corl;
ushort reqevents, *rtneventsp;
void (notify) ();

パラメーターには、以下の値があります。

説明
fp ファイル 構造体を指します。 この構造体は、 選択 サブルーチンによって使用されるファイル・ディスクリプターに対応します。
コルル 自己通知 カーネル・サービスで相関に使用される ID を指定します。
要求イベント 検査するイベントを識別します。 poll 関数と select 関数は、3 つの標準イベント・フラグと 1 つの情報フラグを定義します。 sys/poll.h ファイルには、イベント・ビット定義の詳細が記述されています。 可能なフラグについては、 Fp_SELECT カーネル・サービスを参照してください。
RtneventSP 返されたイベント・ポインターを示します。 参照によって渡されるこのパラメーターは、現時点で true であるイベントを示します。 返されるイベント・ビットには、要求イベントとエラー・イベント標識が含まれます。
notify 指定されたオブジェクトが、未解決の非同期選択またはポーリング・イベント要求に対して 自己通知 カーネル・サービスを呼び出すときに呼び出すルーチンを指します。 ルーチンを呼び出さない場合、このパラメーターはヌルでなければなりません。

正常に実行された場合、 発泡スチロール 操作は値 0 を戻します。 この操作は、エラーを示すゼロ以外の戻り値を戻す必要があります。 可能な値のリストについては、 sys/errno.h ファイルを参照してください。

fstat 要件

fstat 操作は、 属性 構造体を埋めます。 FP パラメーターで指定されたオブジェクト・タイプによっては、構造内の多くのフィールドが適用されない場合があります。 この操作から戻される値は、オブジェクト・タイプと、そのタイプを認識するルーチンが予期するものの両方によって異なります。 この操作の構文は次のとおりです。

#include <sys/types.h>
int (*fo_fstat) (fp, sbp)
struct file *fp;
struct stat *sbp;

パラメーターには、以下の値があります。

説明
fp ファイル 構造体を指します。 この構造体は、 統計 サブルーチンによって使用されるファイル・ディスクリプターに対応します。
SBP この操作によって充てんされる 統計 構造体を指します。 指定されたアドレスはカーネル・スペース内にあります。

正常に実行された場合、 FSTAT 操作は値 0 を戻します。 ゼロ以外の戻り値は、エラーを示すようにプログラムする必要があります。 可能な値のリストについては、 sys/errno.h ファイルを参照してください。

要件を閉じる

クローズ操作は、 FP パラメーターで指定されたオブジェクトへのルーチン・アクセスを無効にし、そのアクセスに関連するデータをすべて解放します。 この操作は、 ファイル 構造体の使用回数が 0 に減少したときに、 閉じる サブルーチン・コードから呼び出されます。 例えば、オブジェクト ( Dupフォーク、またはその他のサブシステム固有の操作によって作成された) へのアクセスが複数ある場合、 閉じる サブルーチンは、クローズされる ファイル 構造体によるアクセスが残っていないことを判別すると、クローズ操作を呼び出します。

LFS によってファイル記述子と ファイル 構造がセットアップされると、ファイル記述子はオープンしていると見なされます。 ファイル・クローズ操作は、クローズまたは出口が指定されるたびに呼び出されます。 その結果、クローズ操作は、 ファイル 構造体が初期設定される前に呼び出し元が行ったことに応じて、完全にオープンされていないオブジェクトをクローズできなければなりません。

クローズ操作の構文は次のとおりです。

#include <sys/file.h>
int (*fo_close) (fp)
struct file *fp;

パラメーターは以下のとおりです。

項目 説明
fp ファイル 構造体を指します。 この構造体は、 閉じる サブルーチンによって使用されるファイル・ディスクリプターに対応します。

正常に実行された場合、 発泡スチロール 操作は値 0 を戻します。 この操作は、エラーを示すゼロ以外の戻り値を戻す必要があります。 可能な値のリストについては、 sys/errno.h ファイルを参照してください。

実行環境

ufdcreate カーネル・サービスは、 プロセス環境 からのみ呼び出すことができます。

戻り値

ufdcreate カーネル・サービスが成功すると、値 0 を返します。 カーネル・サービスが失敗すると、ゼロ以外の値を戻し、 エラー番号 グローバル変数を設定します。

エラー・コード

以下の 1 つ以上のエラーが発生すると、 ufdcreate カーネル・サービスは失敗します。

エラー 説明
EINVAL 操作 パラメーターがヌルであるか、 FileOps 構造体にすべての操作の項目が含まれているわけではありません。
EMFILE プロセスのすべてのファイル記述子は既に割り振られています。
ENFILE システム・ファイル・テーブルがいっぱいです。