Linux报 “inappropriate ioctl for device” 异常的原因以及解决办法

yizhihongxing

「inappropriate ioctl for device」表示给设备发送了不适当的ioctl命令,通常出现在打开设备或文件时出现,这个错误主要有两个原因:一是设备或文件不支持这个ioctl命令,二是程序使用了错误的ioctl命令。

解决办法有以下几种:

  1. 程序错误

在程序中使用了错误的ioctl命令,需要检查程序中使用的ioctl命令是否正确,有没有错误的拼写或使用。

示例:

int fd = open("/dev/ttyS0", O_RDWR);
if(fd < 0){
    printf("Open serial device failed!\n");
    return -1;
}

struct termios option;
tcgetattr(fd, &option);

option.c_cflag |= (CLOCAL | CREAD);
option.c_cflag &= ~CSIZE;
option.c_cflag |= CS8;
option.c_cflag &= ~CSTOPB;
option.c_cflag &= ~PARENB;

option.c_iflag &= ~(IXON | IXOFF | IXANY);
option.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG);

option.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

cfsetispeed(&option, B115200);
cfsetospeed(&option, B115200);

option.c_cc[VTIME] = 0;
option.c_cc[VMIN] = 1;

if(tcsetattr(fd, TCSANOW, &option) < 0){
    printf("Set serial option failed!\n");
    return -1;
}

int fl = fcntl(fd, F_GETFL, 0);
if(fl == -1){
    printf("Get file status flags failed!\n");
    return -1;
}

if(fcntl(fd, F_SETFL, fl | O_NONBLOCK) == -1){
    printf("Set file status flags failed!\n");
    return -1;
}

struct termios m_oldTermios;
bool m_bTermiosSaved = false;
if(tcgetattr(fd, &m_oldTermios) != -1)
{
    m_bTermiosSaved = true;
    struct termios newTermios = m_oldTermios;
    if( /* optimization to only make changes if necessary */
        newTermios.c_iflag & ~(IXOFF | IXON))
    {
        newTermios.c_iflag &= ~(IXOFF | IXON);
        if(tcsetattr(fd, TCSANOW, &newTermios) == -1)
        {
            qWarning("GsmModule::disableSoftFlowControl: Couldn't set new termios attributes");
        }
    }
}

if(m_bTermiosSaved)
{
    if(tcsetattr(fd, TCSANOW, &m_oldTermios) == -1)
    {
        qWarning("GsmModule::disableSoftFlowControl: Could not restore original tty attributes in the destructor");
    }
}
  1. 设备或文件错误

检查设备或文件是否正确打开,以及设备或文件是否支持使用ioctl命令。

示例:

$ sudo touch /sys/kernel/debug/kgsl/graphics/fb0/bw_writeback_enabled
touch: cannot touch '/sys/kernel/debug/kgsl/graphics/fb0/bw_writeback_enabled': No such file or directory

$ sudo chmod 644 /sys/kernel/debug/kgsl/graphics/fb0/*
chmod: cannot access '/sys/kernel/debug/kgsl/graphics/fb0/*': No such file or directory
  1. 使用正确的ioctl命令

检查程序代码中使用的ioctl命令是否有误,以及是否传入正确的参数。

示例:

int fd;

fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd < 0) {
    perror("open");
    return errno;
}

struct termios tty;
memset(&tty, 0, sizeof(tty));
if (tcgetattr(fd, &tty) != 0) {
    perror("tcgetattr");
    return errno;
}

cfsetospeed(&tty, B115200);
cfsetispeed(&tty, B115200);

tty.c_cflag |= (CLOCAL | CREAD);
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8; /* 8-bit data */
tty.c_cflag &= ~PARENB; /* no parity */
tty.c_cflag &= ~CSTOPB; /* 1 stop bit */
tty.c_cflag &= ~CRTSCTS; /* no flow control */

if (tcsetattr(fd, TCSANOW, &tty) != 0) {
    perror("tcsetattr");
    return errno;
}

ioctl(fd, TCGETS, &tty);

tty.c_cc[VTIME] = 0;
tty.c_cc[VMIN] = 1;

ioctl(fd, TCSETS, &tty);

以上就是Linux报inappropriate ioctl for device的原因以及解决办法,需要根据具体情况适用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux报 “inappropriate ioctl for device” 异常的原因以及解决办法 - Python技术站

(1)
上一篇 2023年3月24日
下一篇 2023年3月24日

相关文章

  • Linux报 “too many message queues” 异常的原因以及解决办法

    too many message queues的原因 消息队列(Message Queue)是一种用于进程间通信(IPC)的机制。当Linux系统中的消息队列数量达到系统内核限制时,会抛出too many message queues的错误,即消息队列过多。这种错误通常由以下原因引起: 应用程序过多地创建了消息队列,导致系统资源不足; 消息队列没有被适时的删…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “connection reset by peer” 异常的原因以及解决办法

    连接重置(Connection reset)是指在tcp/ip协议中网络连接被异常中止,常常出现在网络另一端的进程崩溃或主机重启的情况下。在Linux系统中,如果我们无法正常连接网络或访问某些网站时,可能会遇到 connection reset by peer 的错误提示信息。 原因 出现 connection reset by peer 错误的原因主要有以…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “connection refused by peer” 异常的原因以及解决办法

    connection refused by peer(连接被对端拒绝)通常是在客户端连接服务端时出现的错误。这个错误一般有以下可能的原因: 服务端程序没有启动或没有在正确的端口上监听连接。比如,运行在 8080 端口的 web 服务器没有被正确地启动或停止了。 防火墙或安全策略拦截了连接请求。如果有一个防火墙或其他安全策略在服务端和客户端之间,可能会拦截来自…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “no buffer space available” 异常的原因以及解决办法

    当Linux系统内核中的网络缓冲区没有可用空间时,会报出 “no buffer space available” 错误。 出现这个问题的主要原因是因为系统的TCP和UDP接收缓冲区被填满了。当进程读取网络数据时,如果缓冲区已满,就无法处理更多的数据包,便会出现这个错误。 为了解决这个问题,有两种方法可以尝试:调整缓冲区大小和增加缓冲区数量。 第一种方法:调整…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “dynamic linker cannot find library” 异常的原因以及解决办法

    当我们在Linux系统中运行一个程序时,如果系统无法找到程序需要的动态链接库(shared library),就会提示 “dynamic linker cannot find library” 的错误信息。这个错误通常出现在以下情况: 没有正确安装相应的库文件 如果我们正在使用的程序需要使用系统中没有提供的某个库文件,我们需要手动安装这个库文件。例如,如果我…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “invalid argument” 异常的原因以及解决办法

    一、报 invalid argument 的原因 在 Linux 操作系统中,当用户执行系统调用时,若传入的参数不符合要求或不合法,则系统会返回错误代码 EINVAL(invalid argument)。这种错误通常说明程序或参数有误,可能导致系统无法正常工作。常见的引起 invalid argument 的因素有以下几种: 1.函数或系统调用传入的参数为空…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “multicast source filter not found” 异常的原因以及解决办法

    首先,”multicast source filter not found”是Linux操作系统中可能出现的一个错误提示。这个错误通常出现在使用网络组播(multicast)功能时。组播是一种一对多的网络传输方式,可以节约网络带宽,提高数据传输效率。但是,使用组播需要一些特别的配置和设置。 下面我就分享一下,解决这个错误的方法: 原因分析 当你试图加入一个组…

    Linux常见异常 2023年3月24日
    00
  • Linux报 “operation not supported” 异常的原因以及解决办法

    针对这个问题,我会给你提供较为详细的解释和解决方法。下面是我整理的具体步骤: 1. 问题原因 出现 “operation not supported” 错误可能是因为以下原因之一: 缺少权限:在某些情况下,需要拥有管理员权限才能执行该操作。 硬件驱动问题:驱动程序可能不支持某些操作或不被正确安装。 文件系统问题:在某些操作或情况下,文件系统可能不支持或不允许…

    Linux常见异常 2023年3月24日
    00
合作推广
合作推广
分享本页
返回顶部