c ++设备不合适的ioctl

Posted

技术标签:

【中文标题】c ++设备不合适的ioctl【英文标题】:c++ Inappropriate ioctl for device 【发布时间】:2014-09-17 03:18:27 【问题描述】:

我使用的是通常连接在 /dev/ttyUSB0 上的 USB 设备

有时当有更多 USB 设备时,它会转到 /dev/ttyUSB1 或其他设备

我在 /etc/udev/rules.d/myrule.rules 下添加了一条规则,其中包含以下行:

SUBSYSTEM=="usb", ATTRSidVendor=="xxxx", ATTRSidProduct=="yyyy", MODE="0666", SYMLINK="MyUSB"

这很好,当我插入我的 USB 设备时,我准备好 /dev/MyUSB 文件。

问题是,当我尝试使用我的 C++ 程序访问此文件时,它无法发送消息:“设备的 ioctl 不合适”。 如果我使用 /dev/ttyUSB0,它也可用,一切正常。

我必须修改我的 C++ 代码来处理 SYMLINKS 吗?

提前致谢,

卡尔斯。

【问题讨论】:

我想你可以在这里找到答案(从文件描述符中检索设备信息):***.com/questions/16070737/… 你可以使用 fstat 从文件描述符中获取设备 【参考方案1】:

这似乎有效。我使用闪存驱动器对其进行了测试

在 /etc/udev/rules.d/myrule.rules 中添加规则 使用 sudo udevadm control --reload-rules 重新加载规则 在节目中

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

int main()     
  struct stat buf;
  int fd = open("/dev/MyUSB", O_RDWR  | O_CREAT);
  int k = fstat(fd, &buf);

  // The device handle is contained in st_rdev
  dev_t dt = buf.st_rdev;
  return 0;

【讨论】:

是的,您发布的内容很有意义,这就是我的代码的样子。但它不起作用......它总是给我同样的消息“不适合设备的 ioctl”。 真的很奇怪,我用标准的闪存驱动器测试过。您使用的是哪种设备 - 您是否尝试过以 root 身份运行它。也许你的工具链坏了。 该设备是电机板控制器。你说我的takechain坏了是什么意思? 我一直在使用 GNU 工具链进行交叉编译,例如ARM,在某些情况下,我使用了与正在运行的内核不兼容的驱动程序或头文件。我建议您使用标准 USB 闪存盘尝试上述操作 - 如果这给出相同的错误,这将显示损坏的工具链

以上是关于c ++设备不合适的ioctl的主要内容,如果未能解决你的问题,请参考以下文章

opencv 无法停止流:设备的 ioctl 不合适

套接字读取设备的 ioctl 不合适

从 perl 脚本调用 unoconv 时设备的 ioctl 不合适

在 Jenkins 下运行时,maven-gpg-plugin 失败并显示“设备的 ioctl 不合适”

Errno::ENOTTY 通过 SuSe 上的 Net::SSH 连接到远程服务器时设备的 ioctl 不合适(使用 Ruby on Rails 5.2.4)

如何在 C 中将 IOCTL 发送到 Windows 上的所有驱动程序