如何在Python中的Linux设备文件上执行低级I/O?
我有一个设备,它返回一个字符串以响应写入设备文件的命令。我能够向设备写入命令,并使用如下代码读取C中的返回字符串:如何在Python中的Linux设备文件上执行低级I/O?,python,linux,posix,Python,Linux,Posix,我有一个设备,它返回一个字符串以响应写入设备文件的命令。我能够向设备写入命令,并使用如下代码读取C中的返回字符串: int dev = open("/dev/USBDev251", O_RDWR); write(dev, data, sizeof(data)); read(dev, buff, 16); 我正尝试在Python中使用以下工具执行同样的操作: dev = os.open("/dev/USBDev251", os.O_RDWR) os.write(dev, data) os.rea
int dev = open("/dev/USBDev251", O_RDWR);
write(dev, data, sizeof(data));
read(dev, buff, 16);
我正尝试在Python中使用以下工具执行同样的操作:
dev = os.open("/dev/USBDev251", os.O_RDWR)
os.write(dev, data)
os.read(dev, 16)
写入成功,但只返回空字符串。我在这里遗漏了什么?根据:
注意:此函数用于低级I/O,必须应用于由os.open()
或pipe()
返回的文件描述符。要写入由内置函数open()
或popen()
或fdopen()
或sys.stdout
或sys.stderr
返回的“文件对象”,请使用其write()
方法
你不应该在这里混搭。如果使用全局函数open()
打开文件,则只能使用文件对象的read()
和write()
方法。相反,如果使用os.open()
打开文件,则只能使用os.read()
和os.write()
因此,尝试将对open()
的调用替换为os.open()
;或者,保持open()
调用,并将os.write(dev,…)
替换为dev.write(…)
,将os.read(dev,…)
替换为dev.read(…)添加一个os.lseek()
以查找回您编写的字符串的开头。目前,您写入了16个字节,使指针向前移动。当你阅读时,你从当前指针开始阅读,所以你需要把它备份到你写的东西的开头
这对我很有用:
#!/usr/bin/python
import os
data = "xxxxxxxxxxxxxxxx"
dev = os.open("/dev/sdp1", os.O_RDWR)
os.write(dev,data)
os.lseek(dev,0,os.SEEK_SET)
print os.read(dev,16)
问题原来出在设备驱动程序上。使用驱动程序的文件操作注册的read()
方法调用copy\u to\u user()
,但随后返回0
,而不是复制到用户空间的字节数
上面的C代码“起作用”,因为它实际上没有检查read()
的返回值,并且buff
被响应填充。我的道歉。事实上,我使用的是os.open()。更正了问题。os.write是否返回了您希望写入的预期字节数?@hogliux,是的,写入成功。您确定设备确实返回了一些内容吗?我正在查看os.open
、os.write
和os.read
的源代码,我看不出它为什么不能工作。您正在打印os.read的返回值吗?@VamsiKrishna,这对于磁盘上的常规文件是正确的,但对于设备文件不一定如此。另外,海报上说C代码是有效的。