et_wait 内核服务

用途

强制正在调用的内核线程等待事件发生。

语法

#include <sys/types.h> #include <sys/errno.h> #include <sys/sleep.h> 无符号 long et_wait ( wait_mask, clear_mask, 标志) 无符号 long wait_mask; 无符号 long clear_mask; 英特 标志;

参数

描述
等待掩码 指定要等待的事件的掩码。
clear_mask 指定要清除的事件的掩码。
标志 指定用于控制信号出现时的操作的标志。

标志 参数用于控制信号如何影响等待事件的情况。 有两个标志值:

EVENT_SIGRET
导致等待事件被未屏蔽的信号结束,并且返回值设置为 EVENT_SIG
EVENT_SIGWAKE
使事件由未屏蔽的信号和控制结束,并将返回值设置为 EXSIG,该信号和控制从最后一次 塞廷普 调用传送到返回。
EVENT_SHORT
禁止因信号而终止等待。 此标志应仅用于短的,有保证的唤醒休眠。
注: EVENT_SIGRET 标志将覆盖 EVENT_SIGWAKE 标志。

描述

等待 内核服务会强制调用内核线程等待指定的事件发生。

等待掩码 参数指示掩码,其中每个等于 1 的 1 集合都表示线程必须等待的事件。 clear_mask 参数指示在等待完成时必须清除的事件的掩码。 对 等待 服务的后续调用将立即返回,除非您清除位,这将结束等待。

注: 仅当锁定事件或锁定字时,才可以在禁用中断的情况下调用 等待 服务。

使用 et_wait 的策略

如果使用 EVENT_SIGRET 标志调用 等待 内核服务,那么在接收到信号时将清除暂挂事件字段。 如果同一个内核线程再次调用 等待 ,那么该线程将无限期地等待已发生的事件。 发生这种情况时,线程不会运行到完成。 仅当同时发布事件和信号时,才会发生此问题。

要避免此问题,请使用下列其中一种编程方法:

  • 使用 EVENT_SHORT 标志可防止信号唤醒线程。
  • 通过使用 limit_sigs 内核服务,在调用 等待 之前屏蔽信号。 然后调用 等待。 调用 sigprocmask 调用以使用 limit_sigs 先前返回的掩码来复原信号掩码。

等待 服务还用于清除事件,而不等待它们发生。 这是通过执行下列其中一项操作来完成的:

  • 等待掩码 参数设置为 EVENT_NDELAY
  • clear_mask 参数中对应于要清除的事件的位设置为 1。

由于 等待 服务会返回事件掩码,指示已实际清除的事件,因此可以使用这些方法来轮询这些事件。

执行环境

等待 内核服务只能从 流程 环境中进行调用。

返回值

成功完成后, 等待 服务会返回一个事件掩码,指示终止等待的事件。 如果指定了 EVENT_NDELAY 值,那么返回的事件掩码将指示此调用已清除的暂挂事件。 否则,它将返回以下错误代码:

描述
EVENT_SIG 指示已设置 EVENT_SIGRET 标志,并且等待已由信号终止。