ddselect 设备驱动程序入口点
用途
检查以确定设备上是否发生了一个或多个事件。
语法
参数
| 项 | 描述 |
|---|---|
| 德夫诺 | 指定主要和次要设备号。 |
| 事件 | 指定要检查的事件。 |
| 收入 | 返回的事件指针。 此参数 (通过引用传递) 由 ddselect 例程用于指示在调用时所选事件中的哪些事件为 true。 在输入此例程之前,由 收入 参数指向的返回事件位置设置为 0。 |
| 禅 | 指定通道号。 |
描述
在使用 选择 或 轮询 子例程时,或者在调用 fp_select 内核服务时,将调用 ddselect 入口点。 它确定设备上是否发生了一个或多个指定事件。
只有字符类设备驱动程序才能提供 ddselect 例程。 即使在提供原始读/写访问权时,也无法由块设备驱动程序提供。
请求提供有关事件的信息
事件 参数表示要检查为标志 (位) 的可能事件。 当应用于支持选择或轮询操作的设备时,为 选择 和 轮询 子例程定义了三个基本事件:
| 事件 | 描述 |
|---|---|
| POLLIN | 设备上提供了输入。 |
| POLLOUT | 设备能够进行输出。 |
| POLLPRI | 设备上发生了异常情况。 |
第四个事件标志用于指示 ddselect 例程是否应该记录此请求,以便稍后使用 塞尔通知 内核服务来通知事件。 如果不需要设备驱动程序来提供所请求事件的异步通知,那么可以在 事件 参数中设置此标志:
| 事件 | 描述 |
|---|---|
| POLLSYNC | 此请求仅是同步请求。 该例程不需要对此请求调用 塞尔通知 内核服务,即使稍后发生事件也是如此。 |
对于 轮询 子例程调用上特定于设备的事件,将保留 事件 参数中的其他事件标志。
选择处理
如果 事件 参数中指定的一个或多个事件为 true ,那么 ddselect 例程应通过在 收入 参数中设置相应的位来指示此情况。 请注意, 收入 返回的事件参数是通过引用传递的。
如果任何请求的事件都不为 true ,那么 ddselect 例程会将返回的事件参数设置为 0。 它通过 收入 参数按引用进行传递。 它还会检查 事件 参数中的 POLLSYNC 标志。 如果此标志为 true ,那么 ddselect 例程应仅返回,因为该事件请求仅是同步请求。
但是,如果 POLLSYNC 标志为 false ,那么稍后发生一个或多个指定的事件时, ddselect 例程必须通知内核。 出于此目的,例程应该为 事件 参数中请求的每个事件设置单独的内部标志。
当这些事件中的任何事件变为 true 时,设备驱动程序例程应该使用 塞尔通知 服务来通知内核。 然后应重置相应的内部标志以防止重新通知该事件。
有时,设备可能处于无法满足受支持的一个或多个事件的状态 (例如,当通信线路不可运行时)。 在此情况下, ddselect 例程应仅将相应的 收入 标志设置为 1。 这防止 选择 或 轮询 子例程无限期地等待。 但是,在此情况下,调用者将无法区分满足的事件和不满足的事件。 仅当带有 NDELAY 选项的后续请求失败时,才会检测到错误。
执行环境
只有在进程环境中才会执行 ddselect 例程。 它应该通过将锁定内核服务与驱动程序中定义的专用锁定字结合使用来提供其数据结构的必需序列化。
返回值
如果所请求的选择或轮询操作对于指定的资源有效,那么 ddselect 例程应返回返回码 0。 但是,如果以下任一项为 true ,那么请求的操作无效:
- 设备驱动程序不支持所请求的事件。
- 设备处于轮询和选择操作未被接受的状态。
在这些情况下, ddselect 例程应该会返回非零返回码 (通常为 EINVAL) ,并且不将相关 收入 标志设置为 1。 这会导致 轮询 子例程返回到调用者,并在与此资源关联的返回事件参数中设置 POLLERR 标志。 选择 子例程向调用者指示对于此资源,所有请求的事件都为 true。
如果适用,应使用 POSIX 1003.1 标准中为 select 子例程定义的返回值。