一尘不染

如何使用文件描述符刷新写操作?

linux

事实证明,对open()和fopen()的整个误解源于ARM上Linux
2.6.14内核中有问题的I2C驱动程序。向后移植一个工作不正常的驱动程序,解决了我在此处试图解决的问题的根本原因。

我正在尝试找出Linux(I2C)中串行设备驱动程序的问题。看来,通过在设备上的写入和读取之间添加定时的OS暂停(hibernate),可以使事情工作(更好)。

撇开: I2C的本质是主设备读取或写入的每个字节都由线路另一端(从设备)上的设备确认-暂停的改进使我认为驱动程序是异步工作的-
我无法与公交车的运行方式保持一致。 任何…

我想无论是喜欢 刷新 写可以肯定(而不是使用固定的工期暂停), 以某种方式测试写/读事务已 完成 在多线程友好的方式。

使用的麻烦fflush(fd);是它要求’fd’是流指针(而不是文件描述符),即

FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);

我的问题是我需要使用,ioctl()而不使用流指针。即

int fd = open("filename",O_RDWR);
ioctl(fd,...);

有什么建议吗?


阅读 396

收藏
2020-06-02

共1个答案

一尘不染

您有两种选择:

  1. 使用fileno()以获得与相关的文件描述符stdio流指针

  2. 完全不要使用<stdio.h>,这样您也不必担心刷新-所有写操作都会立即发送到设备,对于字符设备,write()调用甚至要等到下层IO完成(在理论)。

对于设备级IO,我会说使用它很不寻常stdio。我强烈建议使用较低级别open()read()并且write()代替(根据你以后的回复)功能:

int fd = open("/dev/i2c", O_RDWR);
ioctl(fd, IOCTL_COMMAND, args);
write(fd, buf, length);
2020-06-02