Как вы можете очистить запись с помощью файлового дескриптора?
оказывается, все это непонимание open() против fopen () связано с багги-драйвером I2C в ядре Linux 2.6.14 на ARM. Backporting рабочий бит избитый драйвер решил основную причину проблемы, которую я пытался решить здесь.
Я пытаюсь выяснить проблему с драйвером последовательного устройства в 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,...);
предложения?
6 ответов
у вас есть два варианта:
использовать
fileno()
для получения дескриптора файла, связанного сstdio
указатель потокане используйте
<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);
Я думаю, что вы ищете может быть
int fsync(int fd);
или
int fdatasync(int fd);
fsync
сбросит файл из буфера ядра на диск. fdatasync
также будет делать, за исключением мета-данные.
похоже, что вы ищете функцию fsync () (или fdatasync ())?), или вы можете использовать флаг O_SYNC в вызове open ().
Если вы хотите пойти другим путем (связать файл* с существующим файловым дескриптором), используйте fdopen ():
FDOPEN(P)
NAME
fdopen - associate a stream with a file descriptor
SYNOPSIS
#include <stdio.h>
FILE *fdopen(int fildes, const char *mode);