open() 的主要功能是检验是否允许打开请求。open(9E) 的语法如下所示:
int xxopen(dev_t *devp, int flag, int otyp, cred_t *credp);
其中:
指向设备编号的指针。会向 open() 例程传递指针,以便驱动程序可以更改次要设备号。使用此指针,驱动程序能够动态创建设备的次要实例。伪终端驱动程序就是这样,只要打开该驱动程序,就会创建新的伪终端。通常,动态选择次要设备号的驱动程序使用 ddi_create_minor_node(9F) 在 attach(9E) 中仅创建一个从设备节点,然后使用 makedevice(9F) 和 getmajor(9F) 更改 *devp 的次要设备号部分:
*devp = makedevice(getmajor(*devp), new_minor);
您不必调用 ddi_create_minor_node(9F) 来创建新的次要节点。驱动程序不得更改 *devp 的主设备号。驱动程序必须在内部跟踪可用的次要设备号。
使用位指示打开设备是供读取 (FREAD)、写入 (FWRITE) 还是供可同时读写的标志。发出 open(2) 系统调用的用户线程也可以请求对设备进行独占访问 (FEXCL),或指定不得以任何原因阻止打开操作 (FNDELAY),但驱动程序必须强制执行两者。只写设备(例如打印机)的驱动程序可能会将 open(9E) 视为对读操作无效。
表示如何调用 open() 的整数。驱动程序必须检查 otyp 的值是否适用于相应设备。对于字符驱动程序,otyp 应为 OTYP_CHR(请参见 open(9E) 手册页)。
指向包含有关调用方信息(例如用户 ID 和组 ID)的凭证结构的指针。驱动程序不会直接检查此结构,但会使用 drv_priv(9F) 来检查超级用户权限的一般情况。在本示例中,只允许 root 或具有 PRIV_SYS_DEVICES 权限的用户打开设备进行写入。
以下示例显示了字符驱动程序的 open(9E) 例程。
static int xxopen(dev_t *devp, int flag, int otyp, cred_t *credp) { minor_t instance; if (getminor(*devp) /* if device pointer is invalid */ return (EINVAL); instance = getminor(*devp); /* one-to-one example mapping */ /* Is the instance attached? */ if (ddi_get_soft_state(statep, instance) == NULL) return (ENXIO); /* verify that otyp is appropriate */ if (otyp != OTYP_CHR) return (EINVAL); if ((flag & FWRITE) && drv_priv(credp) == EPERM) return (EPERM); return (0); }