8.1. SG_IO

SG_IO 0x2285。这个想法出奇地简单:只需将 sg_io_hdr_t 对象传递给 ioctl(),它将在 SCSI 命令完成时返回。它在逻辑上等同于执行 write() 后跟一个阻塞的 read()。“阻塞”一词在这里意味着 read() 将等待直到 SCSI 命令完成。

同一个文件描述符可以同时用于 SG_IO 同步调用和 write() read() 序列。sg 驱动程序确保 SG_IO 调用的响应永远不会被 read() 意外获取。即使可以以这种方式共享单个文件描述符,但在这种情况下,如果对同一 SCSI 设备使用单独的文件描述符,可能会更明智(并产生更清晰的代码)。

命令完成的等待可能会被信号中断。在这种情况下,SG_IO 调用将产生 EINTR 错误。这处理起来相当复杂,将在下面的 ioctl(SG_SET_KEEP_ORPHAN) 描述中讨论。当 sg 文件描述符以 O_RDONLY 方式打开时,SG_IO 将允许以下 SCSI 命令

所有发送到 SCSI 设备类型 SCANNER 的命令都被接受。其他情况会产生 EPERM 错误。请注意,write() read() 接口必须使用 O_RDWR 打开 sg 文件描述符,因为 Linux 需要写权限才能执行 write() 系统调用。

SG_IO ioctl() 发出某些 SCSI 命令的能力导致与版本 2 sg 驱动程序相比,对以“只读”方式打开的文件描述符进行了一些放宽。open() 调用现在将尝试为所有新打开的文件描述符分配保留缓冲区。ioctl(SG_SET_RESERVED_SIZE) 现在将在“只读”文件描述符上工作。