2010-03-09 3 views
7

utworzyć FIFO:Pierwsze readline do blokowania na FIFO

mkfifo tofetch 

ten kod Pythona:

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

To stragany na readline, jak mam nadzieję. Uruchamiam:

echo "test" > tofetch 

I mój program już się nie zatrzymuje. Czyta wiersz, a następnie kontynuuje zapętlenie na zawsze. Dlaczego nie będzie znowu zwalniać, gdy nie będzie nowych danych?

Próbowałem również spojrzeć na "not fetchlistfile.closed", nie miałbym nic przeciwko ponownemu otwieraniu go po każdym napisaniu, ale Python uważa, że ​​fifo jest nadal otwarty.

Odpowiedz

4

Zgodnie z dokumentacją dla readline zwraca pusty łańcuch tylko wtedy, gdy znajdujesz się na końcu pliku. Zamknięty nie jest tym samym, co koniec pliku. Obiekt pliku zostanie zamknięty tylko wtedy, gdy wywołasz .close(). Kiedy twój kod dojdzie do końca pliku, readline() powraca zwracając pusty ciąg.

Jeśli po prostu użyjesz obiektu pliku jako iteratora, Python automatycznie odczyta wiersz i zatrzyma się na końcu pliku. Tak:

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

Komenda echo "test" > tofetch otwiera nazwanego potoku, pisze „test” do niego i zamyka to koniec rury. Ponieważ końcowy koniec rury jest zamknięty, koniec odczytu widzi koniec pliku.