No me parece y encontré un link that supports my opinion. ¿Qué piensas?¿Se puede leer un archivo regularmente de IO no bloqueante?
Respuesta
El contenido del enlace que publicó es correcto. Un socket de archivo regular, abierto en modo no bloqueante, siempre estará "listo" para leer; cuando realmente intentas leerlo, se producirá un bloqueo (o más exactamente como señala tu fuente, durmiendo) hasta que la operación pueda tener éxito.
En cualquier caso, creo que su origen necesita algunos sedantes. Una persona enojada, eso es.
Usted es correcto que el modo no bloqueante no tiene ningún beneficio para los archivos normales, y no se le permite. Sería bueno si hubiera un indicador secundario que pudiera establecerse, junto con O_NONBLOCK
, para cambiar esto, pero debido a la forma en que funciona el caché y la memoria virtual, en realidad no es una tarea fácil definir qué comportamiento correcto de "no bloqueo" para los archivos ordinarios significaría. Ciertamente habría condiciones de carrera a menos que permitiera a los programas bloquear la memoria asociada con el archivo. (De hecho, una forma de implementar una especie de IO no dormir para los archivos ordinarios sería mmap
el archivo y mlock
el mapa. Después de eso, en cualquier aplicación razonable, read
y write
nunca dormir, siempre y cuando el archivo de offset y el tamaño del búfer se mantuvo dentro de los límites de la región mapeada.)
En cuanto a mmap() ... sería un bloqueo para convertir el archivo en no bloqueante ... ;-) –
No es * que * difícil definir qué comportamiento sin bloqueo podría significar para los archivos comunes. El kernel debería señalar el archivo como listo para leer cuando los datos solicitados por la siguiente 'lectura 'se encuentran en la memoria caché de la página. Si se ha ido para entonces, el kernel podría simplemente devolver 'EWOULDBLOCK' (y agregar el rango solicitado a alguna captación previa obligatoria y cuando esté disponible, el archivo estará listo para leer, y así sucesivamente). No sería una condición de carrera si todos se implementan correctamente, pero existiría la posibilidad de un bloqueo en vivo si muchos procesos siguen intentándose superarse entre sí y ninguno progresa. – DepressedDaniel
He estado indagando bastante sobre esto durante las últimas horas y puedo atestiguar que el autor del enlace que ha citado es el correcto. Sin embargo, el soporte parece ser "mejor" (usando ese término muy vagamente) para non-blocking IO against regular files en Linux Kernel nativo para v2.6 +. El paquete "libaio" contiene una biblioteca que expone la funcionalidad ofrecida por el núcleo, pero tiene algunas advertencias sobre los diferentes tipos de sistemas de archivos que son compatibles y no es portátil para nada fuera de Linux 2.6+.
Y aquí es another good article sobre el tema.
- 1. ruby línea no bloqueante leer
- 2. Bloqueo de IO frente a IO no bloqueante; en busca de buenos artículos
- 3. ¿Se puede configurar SQLAlchemy para que no sea bloqueante?
- 4. arrayWithContentsOfFile no puede leer el archivo plist
- 5. No se puede utilizar [] para leer
- 6. JAVA: No se puede leer el cuerpo de un 401
- 7. Web.Config - No se puede leer el archivo de configuración debido a permisos insuficientes
- 8. Twisted: Haciendo código no bloqueante
- 9. No se puede escribir un archivo binario
- 10. ¿Cómo se puede leer el contenido de un archivo binario en una cadena en Clojure?
- 11. ¿Se puede leer un archivo web.config desde un archivo xml externo?
- 12. ¿Cómo escribir en un archivo usando IO sin bloqueo?
- 13. ¿Cómo se implementa IO sin bloqueo?
- 14. corriente no soporta concurrente IO leer ni escribir operaciones
- 15. Io operadores, parece que no pueden crearlos en un archivo
- 16. "No se puede leer la propiedad 'xxx' de nulo"
- 17. ¿Cómo hacer un QMessageBox no bloqueante y no modal?
- 18. No se puede leer el archivo de propiedades de AppletViewer - Applet
- 19. Javascript "no se puede leer la propiedad" barra "de indefinido
- 20. No se puede leer la propiedad 'estilo' de nulo
- 21. No se puede leer la longitud característica de indefinido
- 22. Optimizar archivo C# IO
- 23. No se puede leer el TLD "META-INF/c.tld"
- 24. ¿Puede Fortran leer los bytes directamente desde un archivo binario?
- 25. Python - tempfile.TemporaryFile no se puede leer; ¿por qué?
- 26. El nombre de archivo feed1.xls no se puede leer en php
- 27. fifo/named pipe no bloqueante/asincrónico en shell/filesystem?
- 28. no se puede abrir archivo de seguimiento
- 29. Subversion No se puede leer la línea de longitud en el archivo
- 30. No se puede descargar archivo de seguimiento
Solo me pareció ligeramente enojado. –