Mit Hardware-Beschleunigung und schnellem Netz hilft Desktop-Virtualisierung, Administrationsaufwand und Kosten sparen, ADMIN 04/2013 verrät, wie die ... (mehr)

Richtige Signalbehandlung

Das Problem ist, dass das Programm auf zwei Dinge gleichzeitig warten will: Signale und Daten aus dem Socket. Zur Lösung sind drei Wege denkbar:

  • Der Kernel wird angewiesen, ein Signal zu senden, wenn der Socket lesbar wird, siehe [9].
  • Das Signal wird irgendwie so auf einen Dateideskriptor abgebildet, dass dieser lesbar wird, wenn ein Signal eintrifft.
  • Der Kernel implementiert einen System-Aufruf, dem sowohl erwartete Signale als auch Dateideskriptoren übergeben werden und der so ähnlich arbeitet wie »select« , siehe [8].

Alle drei Arten sind unter Linux implementiert und dank zusätzlicher Module vom CPAN auch unter Perl nutzbar. Ich werde mich im Folgenden auf den zweiten Weg konzentrieren.

Eine unter Unix-ähnlichen Systemen recht kompatible Methode das zu implementieren, ist unter dem Namen "Self-Pipe Trick" [7] bekannt. Dazu erzeugt man für jedes zu erwartende Signal eine Pipe. Beide Enden der Pipe werden in den nicht-blockierenden Modus geschaltet. Der zu diesem Zweck in C zu implementierende Signal-Handler schreibt dann ein beliebiges Byte in die Pipe. Das kann schiefgehen, wenn die Pipe voll ist. Aber es wird den Prozess nicht blockieren, da der Dateideskriptor nicht-blockierend ist. Nun kann das Leseende der Pipe gemeinsam mit anderen Dateideskriptoren mit einem gewöhnlichen Select-, Poll- oder Epoll-Aufruf überwacht werden.

Sparsamer

Die Methode ist jedoch sehr verschwenderisch, denn um ein Bit an Information zu verwalten, wird ein mehrere KByte großer Puffer im Kernel angelegt. Die Linux-Entwickler haben als Gegenmittel die Systemaufrufe »signalfd« und »eventfd« implementiert, um der Verschwendung Einhalt zu gebieten. Das CPAN-Modul »Linux::FD« [4] liefert Unterstützung für beide.

Für Perl-Programmierer bequemer ist allerdings das Modul »AnyEvent« [5] mit »libev« [6] als Backend. Damit wird »eventfd« benutzt, wenn der Aufruf verfügbar ist. Sonst wird eine Self-Pipe gebastelt.

Listing 5 zeigt das Programm. Der interessante Teil spielt sich in der Funktion »query« ab. Mit AnyEvent nicht vertraute Leser sollten einen Abstecher zum Kasten "AnyEvent – eine Kurzübersicht" machen.

Listing 5

burn3.pl

 

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019