read(int sg_fd, void * buffer, size_t count)。在之前的文档中讨论了基于 struct sg_header 的控制块的 read() 操作:www.torque.net/sg/p/scsi-generic.txt(即 sg 版本 2 文档)。本节描述当给定基于 struct sg_io_hdr 的控制块时 read() 的操作。
“buffer”应该指向 sg_io_hdr_t 类型的对象,而 “count” 应该是 sizeof(sg_io_hdr_t) [它可以更大,但多余部分将被忽略]。如果 read() 调用成功,则返回的结果是 “count”。
默认情况下,read() 将返回队列中最旧的已完成请求。read() 不会干扰与此文件描述符上的 SG_IO ioctl() 关联的任何请求,除非在 SG_IO ioctl() 被信号中断的特殊情况下。
如果 SG_SET_FORCE_PACK_ID,1 ioctl() 处于活动状态,则 read() 将尝试获取包,该包的 pack_id(之前在 write() 中给出)与给此 read() 的 sg_io_hdr_t::pack_id 匹配。如果不可用,它将等待或产生 EAGAIN。作为特殊情况,在 sg_io_hdr_t::pack_id 中给 read() 的 -1 将匹配响应等待时间最长的请求。在这种模式下,请注意将 “dxfer_direction” 也设置为任何有效值(例如 SG_DXFER_NONE)。还应适当设置 “interface_id” 成员。
除了 SG_SET_FORCE_PACK_ID 情况(并且仅针对 3 个指示字段),提供给 read() 的 sg_io_hdr_t 对象可以未初始化。请注意,用于可选输出 sense buffer 的 “sbp” 指针值是从之前对应的 write() 中记录的。