Wie deaktiviere ich END-Blöcke in untergeordneten Prozessen?

8

Ich verwende fork häufig in Programmen, die auch END { ... } blocks haben:

%Vor%

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

sagen %Vor%

?

    
mob 29.11.2010, 19:55
quelle

8 Antworten

7
%Vor%

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:

%Vor%


%Vor%

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.

    
ysth 30.11.2010, 02:37
quelle
18

Ich glaube nicht, dass es eine Möglichkeit gibt, zu verhindern, dass END-Blöcke in einem gegabelten Prozess laufen, aber das sollte Sie erkennen lassen:

%Vor%     
cjm 29.11.2010 20:08
quelle
15

perldoc -f beenden

  

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 Sie POSIX:_exit($status) aufrufen, um die Verarbeitung von END und Destruktoren zu vermeiden. Einzelheiten finden Sie perlmod .

    
ephemient 29.11.2010 20:09
quelle
6

Der übliche Weg, sie in fork ed Kindern zu vermeiden, ist gewissermaßen:

%Vor%

Oder, sollten Sie das zu unzuverlässig finden, funktionieren alle und verwenden sogar use strict compliant:

%Vor%

und der onomatopoetische

%Vor%

Rebmemer - In Perl gibt es keine dummen Fragen , aber es kann dumme Antworten geben ...

%Vor%     
tchrist 30.11.2010 05:45
quelle
4

Dieser Code wird von POE :: Wheel :: Run verwendet, um genau das zu tun, was Sie wollen. POE :: Kernel :: RUNNING_IN_HELL ist wahr, wenn $^O eq 'MSWin32' . Passen Sie es Ihren Bedürfnissen an.

%Vor%     
Leolo 30.11.2010 00:33
quelle
1

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.

    
daotoad 29.11.2010 20:09
quelle
0

Ich weiß, das ist nicht sehr hilfreich für Sie, aber ich sage es trotzdem: Verwenden Sie keine END-Blöcke. Es gibt normalerweise einen besseren Weg.

    
Sorpigal 29.11.2010 22:03
quelle
0

Das habe ich getan. am Anfang des Programms (wo ich weiß, dass noch keine Gabelung passiert ist) Speichere die PID.     my $ parent_pid = $$;

%Vor%     
Biswajit Dash 22.08.2016 18:46
quelle

Tags und Links