2010-03-09 8 views
7

creo una FIFO:readline Cómo llegar a bloquear en un FIFO

mkfifo tofetch 

corro el código Python:

fetchlistfile = file("tofetch", "r") 
while 1: 
    nextfetch = fetchlistfile.readline() 
    print nextfetch 

que se ahogue en readline, como espero. Corro:

echo "test" > tofetch 

Y mi programa ya no se paraliza. Lee la línea, y luego continúa girando por siempre. ¿Por qué no se parará nuevamente cuando no haya datos nuevos?

También intenté buscar en "not fetchlistfile.closed", no me importaría reabrirlo después de cada escritura, pero Python cree que la fifo aún está abierta.

Respuesta

4

De acuerdo con la documentación para readline, devuelve la cadena vacía si y solo si está al final del archivo. Cerrado no es lo mismo que fin de archivo. El objeto de archivo solo se cerrará cuando llame a .close(). Cuando su código llega al final del archivo, readline() sigue devolviendo la cadena vacía.

Si solo utiliza el objeto de archivo como un iterador, Python leerá automáticamente una línea a la vez y se detendrá al final del archivo. De esta manera:

fetchlistfile = file("tofetch", "r") 
for nextfetch in fetchlistfile: 
    print nextfetch 

echo "test" > tofetch El comando abre la canalización con nombre, escribe "prueba" a ella, y cierra su extremo de la tubería. Debido a que el extremo de escritura de la tubería está cerrado, el extremo de lectura ve al final del archivo.