Linux SCSI 上层驱动程序(包括 sg)具有“逐级传递”ioctl() 架构。 这意味着请求值(即第二个参数)不被上层驱动程序理解的 ioctl() 将被传递到 SCSI 中间层。 那些不被中间层驱动程序理解的 ioctl() 将被传递到下层(适配器)驱动程序。 如果这 3 个层级都不理解 ioctl() 请求值,则返回 -1 并且 EINVAL 会被放入 errno 中。 按照惯例,请求值的符号名称的开头指示哪个层级将响应 ioctl()。 例如,以 “SG_” 开头的请求值由 sg 驱动程序处理,而以 “SCSI_” 开头的请求值由中间层处理。
大多数 sg ioctl() 通过作为 ioctl() 调用的第三个参数给出的指针来读取或写入信息,并在成功时返回 0。 一些较旧的 ioctl() 从驱动程序获取值,并将该值作为 ioctl() 调用的结果返回(例如 ioctl(SG_GET_TIMEOUT))。
下面列出了所有 sg 驱动程序的 ioctl()。它们都以 “SG_” 开头。 后面列出了几个有趣的 SCSI 中间层 ioctl(),它们以 “SCSI_IOCTL_” 开头。 sg ioctl() 大致按字母顺序排列(忽略 _SET_、_GET_ 和 _FORCE_)。 由于 ioctl(SG_IO) 是一个完整的 SCSI 命令请求/响应序列,因此它首先被列出。