【发布时间】: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