【问题标题】:Python3 read fron character device in blocking modePython3以阻塞模式从字符设备读取
【发布时间】:2020-11-30 12:22:38
【问题描述】:

我写了一个字符设备驱动程序。现在我想在有数据时使用 python 读取它。 但是,我发现模块“io”和“os”在阅读时不会阻塞。后者即使我设置了 os.set_blocking(fd,true)。

有没有办法以阻止模式访问设备? 还是我错过了设备驱动程序中的某些内容(tail 工作正常)?

f=io.open("/dev/tstty0","r")
while (1)
  data=str(f.read(32))
  print("mark") # <--- endless list of marks
  #do somthing

设备驱动的读取函数:

static ssize_t tstty_read(
  struct file *filp,
  char *buffer,
  size_t length,
  loff_t *offset)
{
  unsigned char b;
  unsigned long ofs=0;
  devConfig* dev=filp->private_data;
  if (dev)
  {
    while (fifoGet(&dev->tcp2dev,&b) && (ofs<length))
    {
      if (put_user(b,buffer+ofs))
      {
        printk(KERN_ERR "Could not copy user data");
        return -EINVAL;
      }
      ofs++;
    }
    //printk(KERN_INFO "Reading device");
    return ofs;
  }
  printk(KERN_ERR "Unknown device: %s",filp->f_path.dentry->d_iname);
  return -EINVAL;
};

read 函数从 fifo 读取任何可用的字节。 I none is available 0 返回。

【问题讨论】:

  • f 中的f.open 是什么?
  • 哦,对不起,我的错。在这种情况下,f 是“io”。与“os”的结构几乎相同:os.open("dev/tstty0",os.O_RDONLY) 和os.read(f,32)。
  • 您的驱动程序是“普通”字符设备驱动程序还是 TTY 驱动程序?对于 TTY 驱动程序,TTY 子系统应处理阻塞/非阻塞。对于具有自己的读取文件操作处理程序的“普通”字符驱动程序,它负责处理阻塞/非阻塞。
  • 我的驱动程序是一个普通字符驱动程序,具有我自己的读取功能。那么解决办法就是在驱动的read函数内阻塞,直到有数据?

标签: python-3.x file linux-device-driver


【解决方案1】:

向伊恩·阿博特致敬。字符设备必须实现阻止读取请求的能力。读取文件操作必须评估 filp->f_flags & O_NONBLOCK 以检查客户端是否请求阻塞 I/O。

这个链接帮助我举了一个例子: simple linux driver code for blocking and non-blocking read

这个例子是可行的,但是必须考虑另外两件例子中没有涉及的事情:a) 当你想在读操作中卸载驱动程序时该怎么做(只是不要这样做或者唤醒并中止)? b) 如何中止阻塞 I/O 的客户端?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多