[Python-de] fifo mit readline() auslesen

gerhard quell gquell at skequell.de
Son Feb 6 13:38:55 CET 2005


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hallo Christian,

~ hier ein Beispiel für eine nicht blockierende Eingabe, allerdings für
die Tastatur = stdin, vielleicht kannst Du das Prinzip oder Teile davon
für Deine Problemlösung verwenden.

Gruß Gerhard

# ####################################################################
#!/usr/bin/env python
#-*- encoding: iso8859-15 -*-
# Einlesen von Tastaturereignissen
# ####################################################################
# Autor: Gerhard Quell
# Datum: 2004-09-11
# ####################################################################
import os, sys
import termios
import signal
import fcntl
# ####################################################################
class getchar:
~ """ Einlesen von der Tastatur oder Abwarten der Alarmtime
~ """

~ def __init__(self,handler,alarmtime=2):
~  self.blen=5
~  self.handler=handler
~  self.at=alarmtime
~  self.fd=sys.stdin.fileno()
~  self.old=termios.tcgetattr(self.fd)
~  self.new=termios.tcgetattr(self.fd)
~  self.new[3] = self.new[3] & ~termios.ICANON & ~termios.ECHO
~  self.new[6] [termios.VMIN] = 1
~  self.new[6] [termios.VTIME] =0
~  signal.signal(signal.SIGALRM,self.handler)

~ def getch(self):
~  try:
~   termios.tcsetattr(self.fd, termios.TCSANOW, self.new)
~   termios.tcsendbreak(self.fd,0)
~   signal.alarm(self.at)
~   ch = os.read(self.fd,self.blen)
~   signal.alarm(0)
~   termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.old)
~   return ch
~  except :
~   termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.old)
~   signal.alarm(0)
~   return None

# ######################################################################
def handler(signum,frame):
~  """ Signalhandler
~  """
~  pass
# ######################################################################
if __name__ == "__main__":
~ gch=getchar(handler)
~ print "Zeichen eingeben"
~ while True:
~  cc=gch.getch()
~  if cc != None:
~   for j in cc: print "%x" % ord(j),
~   print
~   if cc[0] in "qQ": sys.exit()
~  else:
~   print "Nichts"
# ######################################################################


Christian Helmbold wrote:
| Hallo,
|
| Danke für den Beispiel-Code! Aber der Kern des Problem scheint mir damit
| nicht gelöst zu sein. os.read() blockiert auch in dem Beispiel nicht, wenn
| keine Daten anliegen. Das "Durchdrehen" wird lediglich durch das Schlafen
| abgemildert. Ich suche eine Lösung, wo der Prozess vom Betriebssystem
| suspendiert wird, wenn er nichts lesen kann. Und bis jetzt finde ich dazu
| bin Python leider keine Lösung :-(
|
| Ist zwar jetzt schon halb OT, aber wie funktioniert das in C? read()
| blockiert in C ja auch nicht, aber fgets() blockiert, das in nach meiner
| Vorstellung auf read() aufbauen müsste. Und letztlich wird das
os.read() von
| Python ja auch nur das read() aus der C Bibliothek nutzen.
|
| Gruß
| Christian
|

- --
- ------------------------------------------------------ skequell ------
~ Gerhard Quell                       Software & Knowledge Engineering
~ Schützenweg 3      eMail:     gquell at skequell.de  Fon: 0731-26400651
~ 89275 Elchingen    web  : http://www.skequell.de  Fax: 0731-26400652
- --------------- pgp: 473EC53C  -  http://www.keyserver.net/en---------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.3.92 (GNU/Linux)

iD8DBQFCBg/fvHbZD0c+xTwRAlpfAJ4p8P/LOQU6e0s0LLa9f6wiQASPGQCeIxfe
ikHyIESqon2zGyANwF/o+Ss=
=d3Rr
-----END PGP SIGNATURE-----