【发布时间】:2010-09-20 12:51:58
【问题描述】:
事实证明,对 open() 与 fopen() 的整个误解源于 ARM 上的 Linux 2.6.14 内核中存在错误的 I2C 驱动程序。向后移植一个工作位 bashed 驱动程序解决了我试图在这里解决的问题的根本原因。
我正在尝试找出 Linux (I2C) 中的串行设备驱动程序存在的问题。看来,通过在设备上的写入和读取之间添加定时操作系统暂停(睡眠),事情会工作......(好多了)。
除此之外:I2C 的本质是主机读取或写入的每个字节都由线路另一端(从机)上的设备确认 - 改善事物的暂停鼓励我将驱动程序视为异步工作 - 我无法与总线的工作方式相协调。随便...
我想刷新写入以确保(而不是使用固定持续时间的暂停),或以某种方式测试写/读事务以多线程友好的方式完成。
使用fflush(fd); 的问题在于它需要“fd”作为流指针(不是文件描述符),即
FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);
我的问题是我需要使用ioctl(),它不使用流指针。即
int fd = open("filename",O_RDWR);
ioctl(fd,...);
建议?
【问题讨论】:
-
在用户级代码中,write() 函数是自动不缓冲的。你不需要冲洗它——它是自动冲洗的。事实上,除非你使用特殊的系统调用,否则它也是与设备驱动程序同步的。
-
如果您正在编写内核级模块,规则可能会有所不同,但您可能应该使用文件描述符 i/o 而不是标准(文件指针)i/o。