Ich verwende fork
häufig in Programmen, die auch END { ... }
blocks haben:
Der Child-Prozess führt den END {}
-Block beim Beenden aus, aber normalerweise möchte ich das nicht. Gibt es eine Möglichkeit, zu verhindern, dass ein untergeordneter Prozess den Block END
beim Beenden aufruft? Abgesehen davon gibt es eine Möglichkeit für ein Programm, zu wissen, dass es sich um einen Kindprozess handelt, also könnte ich etwas wie
?
Ich dachte, dass es ein Devel :: -Modul gibt, das euch das auch erlaubt, aber ich kann es jetzt nicht finden.
Natürlich können Sie dies nicht sicher tun, wenn Sie beliebige Module verwenden, die möglicherweise END-Blöcke für ihre eigenen Zwecke verwenden ...
(edit by OP) Sie können die Kontrolle über die END Blöcke mit B::end_av
bekommen. Als Proof-of-Concept:
Normalerweise wäre so etwas zu viel für das, was ich brauche, aber ich kann einige Fälle sehen, in denen das nützlich sein könnte.
Die Funktion exit () wird nicht immer sofort beendet. Es ruft zuerst alle definierten
END
-Routinen auf, aber diese END-Routinen können den Exit selbst nicht abbrechen. Ebenso werden alle Objektdestruktoren, die aufgerufen werden müssen, vor dem eigentlichen Exit aufgerufen. Wenn dies ein Problem ist, können SiePOSIX:_exit($status)
aufrufen, um die Verarbeitung von END und Destruktoren zu vermeiden. Einzelheiten finden Sie perlmod .
Der übliche Weg, sie in fork
ed Kindern zu vermeiden, ist gewissermaßen:
Oder, sollten Sie das zu unzuverlässig finden, funktionieren alle und verwenden sogar use strict
compliant:
und der onomatopoetische
%Vor%Rebmemer - In Perl gibt es keine dummen Fragen , aber es kann dumme Antworten geben ... ☺
%Vor% Setzen Sie einfach eine Art global verfügbares Flag, wenn Sie run_child_code()
ausführen.
Es gibt mehrere Möglichkeiten, dies zu tun, aber ich würde das wahrscheinlich in ein Paket stecken und ein lexikalisches Paket verwenden, um mit dem Speicher umzugehen. Sie könnten auch ein einfaches Variablen-Flag verwenden. Es ist ein bisschen einfacher. Ich mag die Paketlösung, weil sie problemlos über mehrere Module hinweg funktioniert.
%Vor%Erwägen Sie, Ihren Fork-Verwaltungscode in dasselbe Paket einzufügen, um eine einheitliche konsistente API für alle Ihre forkbezogenen Anforderungen zu erstellen.
Das habe ich getan. am Anfang des Programms (wo ich weiß, dass noch keine Gabelung passiert ist) Speichere die PID. my $ parent_pid = $$;
%Vor%