Вы немного усложнили дело, используя промежуточный слой stdio и игнорируя коды возврата функций, которые вы вызываете.
Вы можете использовать O_DIRECT
для получения свежих данных с устройства, но вы должны соблюдать обязательства, которые это накладывает.
В частности, смещение поиска, адрес буфера и размер ввода-вывода должны быть кратны 4096 (или другой степени двойки в зависимости от устройства).
Если вы измените свой код, удалив текущее объявление liveBuffer и включив следующий код в начале, вы обнаружите, что он работает.
#define PAGE 4096
#define STARTBYTE (272384/PAGE*PAGE) // must align
#define OFFSET (272384-STARTBYTE)
#define ITEMSIZE (sizeof(*liveBuffer))
#define LIVEBUFSIZE ((OFFSET+NUM_VARS*ITEMSIZE+PAGE-1)/PAGE*PAGE)
signed short *liveBuffer;
if(posix_memalign((void**)&liveBuffer, PAGE, LIVEBUFSIZE)!=0)
exit(5);
if (fcntl(fileno(input), F_SETFL, O_DIRECT) == -1)
exit(6);
Теперь вы должны fread()
использовать LIVEBUFSIZE/ITEMSIZE
, а не NUM_VARS.
Поскольку STARTBYTE
должен быть выровнен, теперь вам нужно начать дальше в массиве liveBuffer
по адресу OFFSET/ITEMSIZE
, чтобы найти нужные данные.
Вы также должны изменить все вызовы, чтобы проверить правильные коды возврата.