есть прибор с немного странным интерфейсом: в нем контроллер usb mass storage устройства, виден он как флешка на 32М (-t vfat -o sync, dirsync). Команды прибору записываются в один файл, считываются из другого. Тестовая программа
int main(){
int wfd, rfd;
const char wpath[] = "/mnt/ZATA.TXT";
const char rpath[] = "/mnt/DATA.TXT";
char buf[512];
const char cmd_2[] = "COMMANDLINE:2\r";
wfd = open(wpath, O_WRONLY | O_CREAT | O_TRUNC | O_SYNC | O_DIRECT, 0666);
write(wfd, (const void*)cmd_2, 512)
close(wfd);
sync();
rfd = open(rpath, O_RDONLY | O_SYNC);
int bytes = read(rfd, (void*)buf, 512);
close(rfd);
printf("%s\n", buf);
return 0;
}
Выяснилось, что, несмотря на флаги O_SYNC | O_DIRECT запись в прибор все равно не происходит, а данные остаются в кэше страниц. Так что для того чтобы считать показания прибора, приходится делать еще и echo 1 > /proc/sys/vm/drop_caches.
Понимаю, проблема не раз возникала, но гугл предлагает мне только этот вариант решения проблемы. Так как же правильно организовать небуферизованный ввод-вывод в linux?