Оказывается, все это непонимание open() и fopen() проистекает из багги I2C-драйвера в ядре Linux 2.6.14 на ARM. Бэкпординг драйвера с битым рабочим битком решил основную причину проблемы, которую я пытался решить здесь.
Я пытаюсь выяснить проблему с драйвером последовательного устройства в Linux (I2C). Похоже, что добавив временные ОС паузы (спит) между записью и чтением на устройстве, все работает... (намного) лучше.
Кроме того, характер I2C заключается в том, что каждый байт, считанный или записанный мастером, подтверждается устройством на другом конце провода (ведомый) - паузы, улучшающие ситуацию, побуждают меня думать о том, что драйвер работает асинхронно - что я не могу смириться с тем, как работает автобус. Anyhoo...
Я бы либо хотел, чтобы флеш был уверен в записи (вместо использования фиксированной паузы продолжительности), или каким-то образом проверили, что транзакция записи/чтения имеет завершено в многопоточном режиме.
Проблема с использованием fflush(fd);
заключается в том, что он требует, чтобы 'fd' был указателем потока (а не файловым дескриптором), т.е.
FILE * fd = fopen("filename","r+");
... // do read and writes
fflush(fd);
Моя проблема в том, что мне требуется использовать ioctl()
, который не использует указатель потока. то есть.
int fd = open("filename",O_RDWR);
ioctl(fd,...);
Предложения?