Autor: Thomas Groß (thomas_at_tgross.net)
Datum: 17. Sep 2002
On Tue, 2002-09-17 at 16:38, Alexander Holler wrote:
> Hallo Michael,
>
> --On Montag, September 16, 2002 22:25:03 +0200 Michael Lestinsky
> <michael_at_lestinsky.de> wrote:
>
> > Am 16.09.'02 schrieb Michael Lestinsky:
> >> wie wird eigentlich ein Signal (etwa CHLD) verarbeitet?
> >
> > Das Problem ist behoben. Wenn man schon sleep(3) verwendet, dann sollte
> > man auch dessen Manpage gründlich lesen. sleep terminiert nämlich
> > vorzeitig, wenn für ein ankommendes Signal ein Handler definiert worden
> > ist.
>
> Bei Singalhandlern muss man auch sonst arg aufpassen. Es gibt eine Menge
> Funktionen die man in diesen nicht oder nur mit äußerster Vorsicht benutzen
> sollte. Am besten ist es daher, nur eine Variable o.ä. entsprechend zu
> setzen und den Rest der Singalbehandlung im Hauptprogramm vorzunehmen.
Das liegt daran, dass die meisten C Bibliotheken auf denen Perl aufbaut
nicht reentrant sind. Bei der oben erwähnten Methode sollte man darauf
achten, dass die Variable vorher angelegt und initialisiert wurde, weil
sonst ein malloc ausgeführt wird und das kann im Handler auch böse
enden.
Aber ab Perl 5.8 ist das nicht mehr der Fall. Ab dieser Version werden
safe signals unterstützt. Das heißt Perl ignoriert das Signal bis es in
einem sicheren Zustand ist (zwischen zwei Opcodes) und ruft dann erst
den Signalhandler auf. Timeouts aus Systemaufrufen kann man aber immer
noch realisieren.
Näheres dazu in:
perldoc perlipc
thomas
Dieses Archiv wurde generiert von hypermail 2.1.4 : 17. Sep 2002 CEST