Pelo que eu vejo na fonte do kernel , o inotify só dispara depois que uma gravação é concluída (ou seja, seu palpite está errado). Depois que a notificação é disparada, somente duas outras coisas acontecem em sys_write , a função que implementa o write syscall: definindo alguns parâmetros do agendador e atualizando a posição no descritor de arquivo. Este código tem sido semelhante desde 2.6.14 . No momento em que a notificação é acionada, o arquivo já tem seu novo tamanho.
Verifique as coisas que podem dar errado:
- Talvez o leitor esteja recebendo notificações antigas, da gravação anterior.
- Se o leitor chamar
state depois chamarreadou vice-versa, algo pode acontecer entre eles. Se você continuar anexando ao arquivo, chamarstatprimeiro garante que você será capaz de ler até aqui, mas é possível que mais dados tenham sido gravados até o momento em que o leitor chamarread, mesmo que não tenha sido feito. ainda recebeu a notificação de inotify. - O fato de o gravador chamar
writenão significa que o kernel irá escrever o número de caracteres solicitado. Há pouquíssimas circunstâncias em que as gravações atômicas são garantidas em qualquer tamanho. Cadawritechamada é garantida atômica, no entanto: em algum momento os dados não são escritos ainda, e então de repente n bytes foram escritos, onde n é o retorno valor da chamadawrite. Se você observar um arquivo parcialmente escrito, isso significa quewriteretornou menos que seu argumento de tamanho.
Ferramentas úteis para investigar o que está acontecendo incluem:
-
strace -tt - o subsistema auditd