Stellen Sie sich den folgenden Perl-Code vor (hier im Pseudocode):
%Vor%In diesem Fall würde ich die Sperre nicht freigeben, da das Perl-Skript in Zeile 2 endet. In diesem Fall wird das Schloss jemals vom Betriebssystem freigegeben? Sieht es "hey, das Skript, das die Sperre erworben hat, ist abgestürzt" und gibt das Schloss frei? Gibt es die Sperre sofort frei? Gibt es außerdem eine Perl-Instanz, die für jedes Skript ausgeführt wird, sodass klar ist, welches Skript abgestürzt / gestoppt wurde, ohne die Sperre aufzuheben?
In diesem Fall wird das Schloss jemals vom Betriebssystem freigegeben? Sieht er "hey, das Skript, das das Schloss erworben hat, ist abgestürzt" und gibt das Schloss frei? Wird die Sperre sofort aufgehoben?
Alle diese Fragen sind systemabhängig. Perl 5 implementiert keine Dateisperrfunktion, es bietet lediglich eine gemeinsame Schnittstelle zu flock(2)
, fcntl(2)
locking oder lockf(3)
(abhängig von den verfügbaren Betriebssystemen). Es kann auch einen Unterschied geben zwischen dem, was passiert, wenn ein Programm beendet wird, segfaults oder mit einem sigkill getötet wird.
Ein schneller Test unter Linux zeigt, dass eine Sperre unter normalen Ausgangsbedingungen entfernt wird:
%Vor% Mal sehen was passiert wenn wir die
:
Um einen segfault zu erhalten, benötigen wir Zugriff auf C, ich benutze Inline
, um es zu bekommen:
Und schließlich, was passiert, wenn ein Programm gesendet wird SIGKILL
:
Aus diesen Experimenten können wir sehen, dass die Sperre in Linux für jeden der Fälle, mit denen Sie beschäftigt waren, veröffentlicht wurde.
Gibt es auch eine Perl-Instanz für jedes Skript, so dass klar ist, welches Skript abgestürzt / gestoppt wurde, ohne die Sperre aufzuheben?
Ja, Perl 5 hat einen perl
Prozess pro Skript. Selbst wenn Sie forkieren, erhält das Kind seinen eigenen perl
-Prozess. Threading bietet keinen separaten perl
-Prozess.
Hinweis: Wenn ein übergeordneter Prozess eine Sperre erhält und vor dem Sperren nicht aufgibt, hat das untergeordnete Objekt dieselbe Sperre, selbst wenn das übergeordnete Element beendet wird.