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
stat
e depois chamarread
ou vice-versa, algo pode acontecer entre eles. Se você continuar anexando ao arquivo, chamarstat
primeiro 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
write
nã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. Cadawrite
chamada é 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 quewrite
retornou menos que seu argumento de tamanho.
Ferramentas úteis para investigar o que está acontecendo incluem:
-
strace -tt
- o subsistema auditd