selreg 内核服务

用途

请向内核注册异步轮询或选择请求。

语法

#include <sys/types.h>
#include <sys/errno.h>
#include <sys/poll.h>
int selreg ( corl,  dev_id,  unique_id,  reqevents,  notify)
int corl;
int dev_id;
int unique_id;
ushort reqevents;
void (*notify) ( );

参数

描述
科尔 用于轮询或选择请求的相关因子。 科尔 参数由 轮询选择 子例程用于将特定选择控制块中返回的事件与进程的文件描述符或消息队列关联。
设备标识 主资源标识值。 与 unique_id 参数一起, 设备标识 参数用于在选择控制块中记录所请求的轮询或选择事件预期将发生的资源。
unique_id 唯一资源标识值。 与 设备标识 参数一起, unique_id 参数表示期望在其中发生所请求的事件的资源。 对于多路复用设备驱动程序,此参数指定期望在其上发生所请求事件的通道的编号。 对于非多路复用设备驱动程序,必须将此参数设置为 0。
请求事件 请求的事件参数。 请求事件 参数由一组位标志组成,这些标志表示正在为其请求通知的事件。 这些标志与对对象的 select 子例程的未满足调用上的 events 参数提供的事件标志具有相同的定义 (请参阅 sys/poll.h 文件以获取定义)。
注: 不应该在此参数中设置 POLLSYNC 位标志。
notify 通知例程入口点。 此参数指向一个用于嵌套轮询和选择调用的通知例程。

描述

塞尔雷格 内核服务由内核上半部分中的 选择 文件操作使用,以向内核注册不满足的异步轮询或选择事件请求。 此注册允许稍后从内核下半部分中的资源调用 塞尔通知 内核服务,以正确识别等待这些资源上的事件的进程。

事件请求可能来自对 轮询选择 子例程的调用,来自进程,或来自对 fp_pollfp_select 内核服务的调用。 在以下情况下, 选择 文件操作将调用 塞尔雷格 内核服务:

  • 轮询或选择请求是异步的 (对于所请求事件的位标志,未设置 POLLSYNC 标志)。
  • 轮询或选择请求 (通过调用底层资源的 ddselect 入口点) 确定所请求的事件尚未发生。

已注册的事件请求采用选择控制块的形式。 选择控制块是包含以下内容的结构:

  • 请求的事件位标志
  • 返回的事件位标志
  • 主资源标识
  • 唯一资源标识
  • 指向 进程 表条目的指针
  • 文件描述符相关因子
  • 指向仅对 轮询选择 子例程进行嵌套调用时不为空的通知例程的指针

每次调用 塞尔雷格 内核服务时,它都会分配并初始化选择控制块。

当在支持 选择 文件操作的资源上发生事件时,该资源将调用 塞尔通知 内核服务。 塞尔通知 内核服务会查找所有选择控制块,这些控制块的主标识和唯一标识与资源的那些标识相匹配,并且其请求的事件标志与资源上发生的事件相匹配。 然后,对于每个匹配的控制块, 塞尔通知 内核服务会根据控制块的通知例程指针是非空 (嵌套) 还是空 (非嵌套) 来执行两个操作过程中的一个:

  • 在对 选择轮询 子例程的嵌套调用中,将使用主资源标识和唯一资源标识,返回的事件位标志以及进程标识来调用通知例程。
  • 在对 选择轮询 子例程的非嵌套调用中 (通常情况下) ,清除在块中标识的进程的 SSEL 位,更新块中返回的事件位标志,并唤醒进程。 以这种方式唤醒的进程会完成它正在休眠的 轮询选择 调用。 然后, 轮询选择 子例程在其进程的选择控制块中收集返回的事件位标志以返回到用户方式进程,取消分配控制块,并返回发生在用户进程中的请求事件数的第一次。

执行环境

塞尔雷格 内核服务只能从 流程 环境中进行调用。

返回值

描述
重大安全事件数量 指示成功完成。
EAGAIN 指示 塞尔雷格 内核服务无法分配 "选择" 控制块。