Ein Filehandle zweimal tie"en?

Ein Filehandle zweimal tie"en?

am 09.10.2006 22:12:13 von df4or

Tag.

Ich stehe vor einer Designentscheidung, bei dem mir mein Unwissen über tie
im Wege steht. Ich verstehe grundsätzlich was 'tie' macht, habe aber keine
nennenswerte praktische Erfahrung damit.

Ich möchte ein serielles Gerät das mehrere Kommunikationskanäle bietet über
einen Multiplexer (server) auf mehrere Sockets abbilden. Ein Client
verbindet sich also zu einem Socket des Servers, der Server bildet diese
Verbindung auf einen der logischen Kanäle des seriellen Gerätes ab.

Dazu bietet sich das Perl Modul IO::Multiplex geradezu zwingend an, passt
bestens. Für die Socketseite jedenfalls...
IO::Multiplex verwendet tied Filehandles für das Schreiben auf einen Stream,
empfangene Daten werden über eine Callbackroutine signalisiert.

Zur Kommunikation mit dem seriellen Gerät wird Device::Serialport verwendet.
Dieses Modul erlaubt das Erstellen einer seriellen Verbindung entweder als
Objekt ($PortObj = Device::SerialPort->new(...)) oder über ein tied
Filehandle ( $PortObj = tie (*FH, 'Device::SerialPort',
$Configuration_File_Name)).

Falls ich den seriellen Port traditionell als Objekt betreibe muss ich
pollen, das sieht auch die Software auf dem seriellen Gerät so vor.

Könnte ich aber den ser. Port als tied Filehandle betreiben, könnte ich das
Handle an IO::Multiplex übergeben und das select Handling dort übernehmen
lassen (IO::Multiplex beschreibt sich selbst als 'fancy' Interface für
select). [1]
Aber in dem Fall wird das übergebene Filehandle nochmals mit tie gebunden um
Ausgaben wie 'write FH, "Bla\n"' machen zu können.

Meine Frage nun: Geht das überhaupt? Also ein Filehandle zu erzeugen und in
Device::SerialPort zu tie'en, und dieses Filehandle dann an IO::Mux zu
übergeben wo es ebenfalls ge-tie'd wird... Ich kanns mir nicht so recht
vorstellen, dass das klappt. Wäre ja auch zu einfach...

Danke für Input.

Ekki

[1] Mir ist klar das ich immer noch pollen muss, aber das würde durch
IO::Multiplex und seinen Timer vereinfacht.