Как вы можете очистить запись с помощью файлового дескриптора?

оказывается, все это непонимание 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 ответов


у вас есть два варианта:

  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);

Я думаю, что вы ищете может быть

int fsync(int fd);

или

int fdatasync(int fd);

fsync сбросит файл из буфера ядра на диск. fdatasync также будет делать, за исключением мета-данные.


fflush() только смывает буферизацию, добавленную stdio fopen() слой, управляемый


похоже, что вы ищете функцию 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);

вы пытались отключить буферизацию?

setvbuf(fd, NULL, _IONBF, 0);