open(const char * filename, int flags). 文件名应该是一个 sg 设备文件名,正如在第 4 章 中讨论的那样。Flags 可以是以下一些标志的或运算组合
O_RDONLY 限制操作为 read() 和 ioctl() (即不能使用 write() )。
O_RDWR 允许执行所有系统调用。
O_EXCL 等待关联的 SCSI 设备上的其他打开操作关闭后才继续。如果设置了 O_NONBLOCK,则当其他人打开 SCSI 设备时返回 EBUSY。不允许 O_RDONLY 和 O_EXCL 的组合。
O_NONBLOCK 设置非阻塞模式。否则会阻塞的调用会返回 EAGAIN (例如 read() ) 或 EBUSY (例如 open() )。ioctl(SG_IO) 忽略此标志。
请注意,可以为同一个 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() 找到获得的实际内存量。保留缓冲区将在以下情况下使用:
它尚未被使用(例如,当使用命令队列时)
write() 或 ioctl(SG_IO) 请求的数据传输大小小于或等于保留缓冲区大小。
如果 >= 0,则返回文件描述符,否则 -1 表示错误。