最近,我成功使用SCSI通用Linux驱动程序(SG)向块设备发出请求。以下是三个头文件,这些头文件提供了操作码,用于从设备传递和检索数据的结构以及其他信息。
SCSI SG头文件:
我正在编写一个小的c程序来确定磁带状态并通过]查找请求>
ioctl(int fd, long int request, &io_buf)
但是经过试验和大量错误,ioctl返回带有错误消息“ Invalid Argument”的
-1
我在Linux上,并且以sudo运行程序。我要发出请求的设备是通过SCSI连接的光盘驱动器。我尝试了磁带状态,并通过将请求(分别为MTIOCGET
或MTIOCTOP
)传递给ioctl
来寻求请求。
磁带状态功能的代码片段,其中fd是open()返回的设备的文件描述符,而mtgetbuf是sys/mtio.h
中mtget结构的实例>
stat = ioctl(fd, MTIOCGET, &mtgetbuf); if (stat == -1) { perror("error on ioctl MTIOCGET request: ") return EXIT_FAILURE; }
除了
mtopbuf
之外,搜索磁带功能的相似代码片段是mtop结构的实例,而MTSEEK是为搜索操作定义的操作码,同样在sys/mtio.h
中>mtopbuf.mt_op = MTSEEK; stat = ioctl(fd, MTIOCTOP, &mtopbuf); if (stat == -1) { perror("error on ioctl MTIOCGET request: ") return EXIT_FAILURE; }
我希望从ioctl以及相应的结构实例mtgetbuf和mtopbuf成功返回,而不是使用无效的参数错误消息并返回-1,以使它们的成员填充设备提供的数据。
即。成功执行
ioctl()
请求的MTIOCGET
命令会将MT_ISSCSI1
,MT_ISSCSI2
或MT_ISUNKNOWN
的值返回到mtgetbuf mt_type成员中(我不相信它是针对其他特定于供应商的设备)。注意:我知道
linux/mtio.h
头文件,并且我尝试用它代替sys/mtio.h
,但结果是相同的。
我正在编写一个小的c程序以使磁带状态并通过ioctl(int fd,long int request,&io_buf)寻求请求,但是经过反复试验和大量错误之后,ioctl的返回值是-1,并带有...
] >最近,我成功使用SCSI通用Linux驱动程序(SG)向块设备发出请求。以下是三个头文件,这些头文件提供了操作码,用于从设备传递和检索数据的结构以及其他信息。
SCSI SG头文件:
/usr/include/scsi/scsi.h /usr/include/scsi/scsi_ioctl.h /usr/include/scsi/sg.h
在线资源的组合有助于理解如何打包,发送和接收请求:
1)TLDP SCSI通用(sg)HOW-TO指南是有关通过SG驱动程序与SCSI设备通信的信息的字体。提供了指向它的链接here。它详细说明了可以发出的各种命令,如何通过创建sg_io_hdr_t结构的实例来打包命令,以及如何发送返回设备的基本供应商信息的SCSI INQUIRY命令的programming example。还有状态码和检测码,用于错误处理和理解失败的SCSI请求。
2)希捷的《 SCSI命令参考手册》有时有助于理解SCSI命令中字节/位的结构。通常,操作码占用第一个字节,其余字节为零。本参考手册中的操作码是在上述三个头文件之间定义的。
我已经能够发送成功的INQUIRY和GET_SG_VERSION_NUMBER请求,并且很可能已经能够发送SEEK(6),READ_CAPACITY(10)和REZERO_UNIT命令。我说这很可能是因为没有返回-1 / errno值,也没有信息被传递回检测缓冲区,这表示警告/错误(SCSI,主机适配器或驱动程序状态代码)。
希望这能回答OP问题。
最近,我成功使用SCSI通用Linux驱动程序(SG)向块设备发出请求。以下是三个头文件,这些头文件提供了操作码,用于从设备传递和检索数据的结构以及其他信息。
SCSI SG头文件: