selnotify 内核服务

用途

轮询选择 子例程或 fp_poll 内核服务中唤醒正在等待的进程。

语法

#include <sys/types.h>
#include <sys/errno.h>
void selnotify ( id,  subid,  rtnevents)
int id;
int subid;
ushort rtnevents;

参数

描述
标识 指示主资源标识值。 内核使用此值以及子标识 (由 子标识 参数指定) 来通知相应的进程所指示事件的发生情况。 如果事件发生所在的资源是设备驱动程序,那么此参数必须是设备主/次编号 (即,已强制转换为 国际dev_t 结构)。 内核为 标识 参数保留了一些值,这些值与套接字,消息队列和命名管道的可能设备主要或次要数字不冲突。
子标识 帮助确定发生了针对内核的事件的资源。 对于多路复用设备驱动程序,这是发生所请求的事件的通道的编号。 如果未对设备驱动程序进行多路复用,那么必须将 子标识 0 设置为 0。
RTnevents 由一组位组成,用于指示已在指定设备或通道上发生的请求事件。 这些标志与在对对象的选择例程进行未满足调用时由 事件 参数提供的事件标志具有相同的定义。

描述

应该由支持选择或轮询操作的设备驱动程序使用 塞尔通知 内核服务。 内核还会使用它来支持对套接字,命名管道和消息队列的选择或轮询请求。

塞尔通知 内核服务会唤醒正在等待 选择轮询 子例程的进程。 缺省情况下,要唤醒的进程是那些指定给定设备的进程以及在指定设备上发生的一个或多个事件。 当多个进程指定 POLLEXCL 标志时,只有请求互斥通知的进程集中的一个进程会收到有关事件的通知。 selectpoll 子例程允许进程请求有关特定设备上的一个或多个事件的信息。 如果尚未发生所请求的任何事件,那么在事件实际发生时,进程将进入休眠状态并在稍后重新唤醒。

只要先前对设备驱动程序的 ddselect 入口点 进行的调用返回并且同时满足以下两个条件,就应该调用 塞尔通知 服务:

  • 所有请求事件的状态为 false。
  • 请求了事件的异步通知。

除了这些条件之外,还可以调用 塞尔通知 服务,但不执行任何操作。

异步通知的事件序列

在以下条件下,设备驱动程序必须存储有关在驱动程序的 ddselect 例程中请求的事件的信息:

  • 所有请求的事件均不为 true (在调用时)。
  • 没有在 事件 参数中设置 POLLSYNC 标志。

如果未设置 POLLSYNC 标志,那么它指示需要异步通知。 在此情况下,当一个或多个请求的事件稍后对该设备和通道变为 true 时,应该调用 塞尔通知 服务。

如果设备驱动程序发现它可以满足 选择 请求 (可能是由于新的输入数据) ,并且该事件的未满足请求仍处于暂挂状态,那么将使用以下项调用 塞尔通知 服务:

  • 标识 参数指定的设备主号码和次号码
  • 子标识 参数指定的通道号
  • 发生的事件由 RTnevents 参数指定

这些参数描述该设备上发生的设备实例和请求的事件。 然后,通知设备驱动程序将其请求的事件标志重置为针对该设备和通道发生的事件。 因此,重置标志指示不再请求那些事件。

如果对 塞尔通知 服务的调用所指示的 RTnevents 参数不再处于等待状态,那么将不会唤醒任何进程。

执行环境

可以从 流程中断 环境中调用 塞尔通知 内核服务。

返回值

塞尔通知 服务没有任何返回值。

实现细节

塞尔通知 内核服务是基本操作系统 (BOS) 运行时的一部分。