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;

参数

描述
标志 指定要保存在 文件 结构中的标志。 file 结构在 sys/file.h 文件中定义。 如果 子例程是使用此例程重新训练的文件描述符来调用的,那么必须正确设置 FREADFWRITE 标志。 有效标志在 fcntl.h 文件中定义。
操作 指向要调用文件系统操作的子系统提供的例程的列表: 读/写, ioctl ,选择, fstat 和关闭。 fileops 结构在 sys/file.h 文件中定义。 请参阅 "文件操作" 以获取更多信息。
数据 指向与类型相关的结构。 系统会将此指针保存在 文件 结构中。 因此,当调用文件操作时,该指针可用于这些操作。
TYPE 文件 结构指定唯一的类型值。 sys/file.h 文件中列出了有效类型。
德国联邦民主党/ 指向一个整数字段,文件描述符在成功返回时存储在该字段中。
茨尔普 指向一个凭证结构。 此指针保存在文件结构中,以便在后续操作中使用。 它必须是有效的 乌克雷德 结构。 可以使用 crref () 内核服务来获取 乌克雷德 结构。

描述

乌夫德创建 内核服务提供用于内核扩展的文件接口。 内核扩展使用此服务来创建文件描述符和文件结构对。 此外,此服务允许内核扩展提供其自己的基于文件描述符的系统调用,从而对文件系统外部的对象启用读/写, ioctl ,选择, fstat 和关闭操作。 乌夫德创建 内核服务不需要扩展就能理解或符合逻辑文件系统 (LFS) 的同步需求。

乌夫德创建 内核服务向调用者提供文件描述符,并创建底层文件结构。 调用者必须包含指向子系统提供的用于读/写, ioctl , select , fstat 和 close 操作的例程的指针。 如果调用子系统不需要任何操作,那么调用者必须提供一个指向相应 错误号 值的指针。 通常,将 EOPNOTSUPP 值用于此目的。 有关子系统提供的例程的需求的信息,请参阅 "文件操作"

除去文件描述符

没有相应的操作来除去由 乌夫德创建 内核服务创建的文件描述符 (以及相应的结构)。 要除去文件描述符,请使用对 关闭 子例程的调用。 关闭 子例程可以从例程调用,也可以从内核或内核扩展中调用。 如果未调用关闭,那么在进程退出时将关闭该文件。

乌夫德创建 内核服务进行调用后,在对该服务的调用返回之前,会将文件描述符视为已打开。 当调用 关闭退出 子例程时,调用对 乌夫德创建 接口的调用上指定的关闭文件操作。

文件操作

乌夫德创建 内核服务允许内核扩展提供其自己的基于文件描述符的系统调用,从而对文件系统外部的对象启用读/写, ioctl ,选择, fstat 和关闭操作。 sys/file.h 文件中定义的 fileops 结构为这些例程提供接口。

读/写需求

读/写操作管理由 菲普 参数指定的对象的输入和输出。 此操作所执行的操作依赖于对象类型。 该操作的语法如下所示:

#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_READ 值 (对于读操作) 或 UIO_WRITE 值 (对于写操作)。
乌约普 指向一个 乌约 结构。 此结构描述所请求的输入和输出的位置和大小信息。 uio 结构在 uio.h 文件中定义。
分机 指定与子系统相关的信息。 如果使用了 子例程,那么该操作传递的值将传递到此子例程。 否则,值为 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 包含与 命令 参数相关的数据。
分机 指定特定于子系统的信息。 如果使用了 Ioctlx 子例程,那么应用程序传递的值将传递给此子例程。 否则,值为 0。
克旗 确定发出调用的位置。 如果通过 fp_ioctl 接口调用此例程,那么 kflag 参数的值为 FKERNEL (来自 fcntl.h 文件)。 否则, 0 值为 0。

如果成功,那么 fo_ioctl 操作将返回值 0。 对于错误, fo_ioctl 操作应该会返回非零返回值以指示错误。 请参阅 sys/errno.h 文件以获取可能的值的列表。

选择需求

选择操作会对 菲普 参数指定的对象执行选择操作。 此操作的语法为如下所示:

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

这些参数具有以下值:

描述
Fp 点至 文件 结构。 此结构对应于 选择 子例程使用的文件描述符。
科尔 指定用于 塞尔通知 内核服务中的相关的标识。
请求事件 标识要检查的事件。 轮询和选择功能定义三个标准事件标志和一个参考标志。 sys/poll.h 文件详细描述了事件位定义。 请参阅 fp_select 内核服务以获取有关可能的标志的信息。
尔特内文茨普 指示返回的事件指针。 此参数 (通过引用传递) 指示当前时间为 true 的事件。 所返回的事件位包括请求事件和错误事件指示符。
notify 指向当指定对象针对未完成的异步选择或轮询事件请求调用 塞尔通知 内核服务时要调用的例程。 如果不调用任何例程,那么此参数必须为空。

如果成功,那么 fo_select 操作将返回值 0。 此操作应该会返回非零返回值以指示错误。 请参阅 sys/errno.h 文件以获取可能的值的列表。

fstat 需求

fstat 操作在 属性 结构中填充。 根据 菲普 参数指定的对象类型不同,结构中的许多字段可能不适用。 从该操作传递回的值取决于对象类型以及任何理解该类型的例程所期望的内容。 此操作的语法为如下所示:

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

这些参数具有以下值:

描述
Fp 点至 文件 结构。 此结构对应于 统计 子例程使用的文件描述符。
斯布普 指向要由该操作填充的 统计 结构。 提供的地址在内核空间中。

如果成功,那么 fo_fstat 操作将返回值 0。 应该对非零返回值进行编程,以指示错误。 请参阅 sys/errno.h 文件以获取可能的值的列表。

关闭需求

关闭操作将使对 菲普 参数指定的对象的例程访问失效,并释放与该访问关联的任何数据。 当 文件 结构使用计数减少到 0 时,将从 关闭 子例程代码调用此操作。 例如,如果对象 (由 重复或其他特定于子系统的操作创建) 有多个访问,那么当 关闭 子例程确定通过正在关闭的 文件 结构没有剩余访问权时,它将调用关闭操作。

一旦 LFS 设置了文件描述符和 文件 结构,就会将文件描述符视为已打开。 每当指定关闭或退出时,就会调用关闭文件操作。 因此,关闭操作必须能够关闭未完全打开的对象,这取决于调用者在初始化 文件 结构之前所执行的操作。

此关闭操作的语法如下所示:

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

参数为:

描述
Fp 点至 文件 结构。 此结构对应于 关闭 子例程使用的文件描述符。

如果成功,那么 关闭 操作将返回值 0。 此操作应该会返回非零返回值以指示错误。 请参阅 sys/errno.h 文件以获取可能的值的列表。

执行环境

仅可从 流程环境 调用 乌夫德创建 内核服务。

返回值

如果 乌夫德创建 内核服务成功,那么它将返回值 0。 如果内核服务失败,那么它会返回非零值并设置 错误号 全局变量。

错误代码

如果发生以下一个或多个错误,那么 乌夫德创建 内核服务将失败:

错误 描述
EINVAL 操作 参数为空,或者对于每个操作, 文件操作 结构不具有条目。
电子文件 该进程的所有文件描述符都已分配。
ENFILE 系统文件表已满。