事实证明,对open()和fopen()的整个误解源于ARM上Linux 2.6.14内核中有问题的I2C驱动程序。向后移植一个工作不正常的驱动程序,解决了我在此处试图解决的问题的根本原因。
我正在尝试找出Linux(I2C)中串行设备驱动程序的问题。看来,通过在设备上的写入和读取之间添加定时的OS暂停(hibernate),可以使事情工作(更好)。
撇开: I2C的本质是主设备读取或写入的每个字节都由线路另一端(从设备)上的设备确认-暂停的改进使我认为驱动程序是异步工作的- 我无法与公交车的运行方式保持一致。 任何…
我想无论是喜欢 刷新 写可以肯定(而不是使用固定的工期暂停), 或 以某种方式测试写/读事务已 完成 在多线程友好的方式。
使用的麻烦fflush(fd);是它要求’fd’是流指针(而不是文件描述符),即
fflush(fd);
FILE * fd = fopen("filename","r+"); ... // do read and writes fflush(fd);
我的问题是我需要使用,ioctl()而不使用流指针。即
ioctl()
int fd = open("filename",O_RDWR); ioctl(fd,...);
有什么建议吗?
您有两种选择:
使用fileno()以获得与相关的文件描述符stdio流指针
fileno()
stdio
完全不要使用<stdio.h>,这样您也不必担心刷新-所有写操作都会立即发送到设备,对于字符设备,write()调用甚至要等到下层IO完成(在理论)。
<stdio.h>
write()
对于设备级IO,我会说使用它很不寻常stdio。我强烈建议使用较低级别open(),read()并且write()代替(根据你以后的回复)功能:
open()
read()
int fd = open("/dev/i2c", O_RDWR); ioctl(fd, IOCTL_COMMAND, args); write(fd, buf, length);