Imagine dos procesos, un lector y un escritor, que se comunican a través de un archivo normal en un ext3 fs. Reader tiene un IN_MODIFY
reloj inotify en el archivo. Writer escribe 1000 bytes en el archivo, en una sola write()
llamada. Reader obtiene el evento inotify y llama fstat
al archivo. ¿Qué ve Reader?
¿Hay alguna garantía de que Reader recuperará al menos 1000
st_size
en el archivo? De mis experimentos, parece que no.¿Hay alguna garantía de que Reader pueda realmente
read()
1000 bytes?
Esto está sucediendo en una caja de E / S seriamente vinculada. Por ejemplo, sar
muestra un tiempo de espera de aproximadamente 1 segundo. En mi caso, el Lector en realidad está esperando 10 segundos DESPUÉS de recibir el evento inotify antes de llamar stat
y obtener resultados demasiado pequeños.
Lo que esperaba era que el evento inotify no se entregaría hasta que el archivo estuviera listo. Lo que sospecho que realmente está sucediendo es que el evento inotify se dispara DURANTE la write()
llamada en el Escritor, y los datos están realmente disponibles para otros procesos en el sistema siempre que estén listos. En este caso, 10 segundos no es tiempo suficiente.
Supongo que solo estoy buscando confirmación de que el kernel realmente implemente inotify de la manera que supongo. Además, si hay alguna opción, posiblemente, para alterar este comportamiento.
Finalmente, ¿cuál es el punto de inotificar, dado este comportamiento? De todos modos, se reduce a sondear el archivo / directorio, después de obtener el evento, hasta que los datos estén realmente disponibles. Bien podría estar haciendo eso todo el tiempo, y olvidarse de inotify.
*** EDITAR ** * * Bien, como sucede a menudo, el comportamiento que estoy viendo realmente tiene sentido, ahora que entiendo lo que realmente estoy haciendo. ^ _ ^
De hecho, estoy respondiendo a un evento IN_CREATE en el directorio en el que vive el archivo. Así que en realidad estoy estadizando () el archivo en respuesta a la creación del archivo, no necesariamente el evento IN_MODIFY, que puede llegar más tarde.
Voy a cambiar mi código para que, una vez que obtenga el evento IN_CREATE, me suscriba a IN_MODIFY en el archivo mismo, y en realidad no intentaré leer el archivo hasta que obtenga el evento IN_MODIFY. Me doy cuenta de que hay una pequeña ventana en la que puedo perder una escritura en el archivo, pero esto es aceptable para mi aplicación, porque en el peor de los casos, el archivo se cerrará después de un número máximo de segundos.