如何为阻止设备的ioctl请求修复'无效参数'

问题描述 投票:1回答:1

我正在编写一个小的c程序来确定磁带状态并通过]查找请求>

        ioctl(int fd, long int request, &io_buf) 

但是经过试验和大量错误,ioctl返回带有错误消息“ Invalid Argument”的-1

我在Linux上,并且以sudo运行程序。我要发出请求的设备是通过SCSI连接的光盘驱动器。我尝试了磁带状态,并通过将请求(分别为MTIOCGETMTIOCTOP)传递给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_ISSCSI1MT_ISSCSI2MT_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问题。

c ioctl scsi
1个回答
0
投票

最近,我成功使用SCSI通用Linux驱动程序(SG)向块设备发出请求。以下是三个头文件,这些头文件提供了操作码,用于从设备传递和检索数据的结构以及其他信息。

SCSI SG头文件:

© www.soinside.com 2019 - 2024. All rights reserved.