7.1. open()

open(const char * filename, int flags). 文件名应该是一个 sg 设备文件名,正如在第 4 章 中讨论的那样。Flags 可以是以下一些标志的或运算组合

flag 中必须设置 O_RDONLY 或 O_RDWR 之一。其他 2 个标志中的任何一个(但不能同时设置)可以进行或运算。

请注意,可以为同一个 SCSI 设备打开多个文件描述符。[这是绕过 SG_MAX_QUEUE 限制的一种方法。] 在 sg 级别,维护单独的状态信息。这意味着即使为单个 SCSI 设备打开了多个文件描述符,它们的 write() read() 序列也基本上是独立的。

由于排他锁(即 O_EXCL),Open() 调用可能会被阻止。排他锁应用于单个 SCSI 设备,并且仅应用于 sg 对该设备的使用(即,它对通过 sd、sr 或 st 访问该设备没有影响)。如果使用 O_NONBLOCK 标志,则原本会阻塞的 open() 调用会返回 EBUSY。扫描 sg 设备以确定其身份(例如,是否为扫描仪)的应用程序应使用 O_NONBLOCK 标志,否则它们有阻塞的风险。

驱动程序将尝试在 open() 时保留 SG_DEF_RESERVED_SIZE 字节(当前 sg.h 中为 32KBytes)。此保留缓冲区的大小随后可以使用 SG_SET_RESERVED_SIZE ioctl() 进行修改。在这两种情况下,这些都是受各种动态约束限制的请求。可以通过 SG_GET_RESERVED_SIZE ioctl() 找到获得的实际内存量。保留缓冲区将在以下情况下使用:

如果 >= 0,则返回文件描述符,否则 -1 表示错误。