Você complicou um pouco o assunto usando a camada intermediária stdio e ignorando os códigos de retorno das funções que está chamando.
Você pode usar O_DIRECT
para obter dados novos do dispositivo, mas deve respeitar as obrigações que isso impõe.
Em particular, o offset de busca, endereço de buffer e tamanho de i / o devem ser múltiplos de 4096 (ou alguma outra potência de 2 dependendo do dispositivo).
Se você modificar seu código para remover sua declaração atual de liveBuffer e incluir o código a seguir no início, você deve achar que funciona.
#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);
Você deve agora fread()
usando LIVEBUFSIZE/ITEMSIZE
em vez de NUM_VARS.
Como o STARTBYTE
precisa estar alinhado, agora você precisa começar a usar o liveBuffer
array em OFFSET/ITEMSIZE
para encontrar os dados desejados.
Você também deve alterar todas as chamadas para verificar os códigos de retorno corretos.