Geschiedenis van de vraag:
Perl is ontwikkeld als een taal voor systeemscripts, daarom is signaalbeheer (SIGTERM, SIGINT, SIGHUP) altijd een ingebouwde en krachtige functie geweest. Dit systeem maakt het mogelijk om externe gebeurtenissen (gebruikersstop, demonherstart, time-outs) te onderscheppen en scripts op een doordachte manier te beëindigen of hun gedrag te wijzigen.
Probleem:
Onjuiste signaalverwerking is een veelvoorkomende oorzaak van incorrecte beëindiging of vastlopen van scripts, gegevensverlies bij onverwachte beëindiging, en de onmogelijkheid om processen opnieuw te starten zonder verlies van status of bronnen.
Oplossing:
Signalen worden verwerkt door handlers in een speciale hash %SIG in te stellen. Een goede praktijk is minimalisme binnen de signaalhandler (bijvoorbeeld een vlag insteken en veilig beëindigen in de hoofdthread). Voor correcte werking in threads en bij meervoudige signaalverwerking worden gespecialiseerde modules gebruikt (bijvoorbeeld POSIX::sigaction).
Voorbeeld:
my $term = 0; $SIG{TERM} = sub { $term = 1; }; while (1) { last if $term; # hoofdwerk } print "Graceful shutdown ";
Belangrijke kenmerken:
Mag je print/IO binnen een signaalhandler gebruiken?
Antwoord: Niet aanbevolen — dit zal leiden tot incorrect gedrag en mogelijke gegevensverlies! De moderne standaard is minimale code (alleen vlaggen insteken/variabelen opschonen).
Wat gebeurt er als de signaalhandler na de eerste activatie niet wordt gereset?
Antwoord: De handler zal meerdere keren worden uitgevoerd als het signaal opnieuw binnenkomt. Als er alleen actie op het eerste evenement vereist is, moet de handler $SIG{...} zelf resetten of signalen naar zichzelf sturen.
Is signaalverwerking thread-veilig in Perl?
Antwoord: Nee! In multithreaded Perl worden signaalhandlers alleen in de hoofdthread (de hoofdinterpreteur) aangeroepen; signalen kunnen binnen threads volledig worden gemist of onjuist worden verwerkt.
Een demonproces roept direct close aan op alle bestandsdescriptoren en verwijdert tijdelijke bestanden in de handler bij het ontvangen van SIGTERM — van tijd tot tijd worden bestanden niet verwijderd, gegevens gaan verloren.
Voordelen:
Nadelen:
De signaalhandler voor SIGTERM stelt alleen de variabele $exit in, waarna de hoofdloop keurig het werk beëindigt, bestanden sluit en pas daarna bronnen vrijgeeft.
Voordelen:
Nadelen: