also generell zu fifos:
eine fifo muss auf beiden enden (input/output) attached sein damit sie richtig funktioniert. Sonst macht man z.B. ein
und das teil "hängt".
wenn man in python die datei öffnet
schläft das python script solange (wenn nichts reinkommt) bis etwas reinkomt und legt dan los.
problem hierbei ist wenn man macht:
Code: Alles auswählen
while True:
datei.open("fifo")
print datei.readline()
datei.close()
arbeitet es erstmal "sinnig" also öffnen - zeile lesen - schliesen - wieder öffnen (und damit schlafen bis was passiert). ALLERDINGS verliert man unter umständen zeilen wenn in die fifo mehrere zeilen reingeschrieben werden (in meinem fall lasse ich syslog reinschreiben und wenn jemand hier mist baut dann können schon 15.000 zeilen in 10min zustande kommen (4.16 zeilen pro sekunde wenn ich mich nicht verrechnet habe)).
wenn man das mit open und close weglässt, und nur readline() macht, und man den prozess beendeet der reinschreibt, dann geht die load hoch weil er ohne ende versucht "readline" zu machen (also der prozess nimmt sich ressourcen was geht).
hier ist die lösung die bis jetzt (ich habe es schon getestet und läuft cool) am besten funktioniert hatt:
erstmal der "writer":
Code: Alles auswählen
#! /usr/bin/env python
import sys
from time import *
fifo = open("test", "a") # Mode "a" or "w"
while True:
try:
print "writing one line"
fifo.write("single line.\n")
fifo.flush()
sleep(5)
except IOError:
break
try:
print "writing two line"
fifo.write("first line.\nsecond one\n")
fifo.flush()
sleep(5)
except IOError:
break
dann der listener:
Code: Alles auswählen
#! /usr/bin/env python
import sys
while True:
print "open"
fifo = open("test","r")
c = 0
while True:
line = fifo.readline()
c += 1
print c
if line:
print line,
else:
print "close"
fifo.close()
print "re-open"
fifo = open("test","r")
zum testen halt beides starten (erst den writer, dann den listener) davor allerdings nicht vergessen die fifo datei zu erstellen mit mkfifo.
Dann den writer beenden (STRG+C) und der listener hört auf zu lesen, closed, open und wartet
bei fragen - mail an mich!

aber ich hoffe ich habe es ausreichend gut erklärt
PS: funktioniert nachweislich unter FreeBSD und Linux
Edit (Leonidas): Code in Python-Tags gesetzt.