Ich habe ein Perl-Skript, das Gabeln.Was passiert mit einem SIGINT (^ C), wenn es an ein Perl-Skript gesendet wird, das Kinder enthält?
Jeder Fork führt ein externes Programm aus, analysiert die Ausgabe und konvertiert die Ausgabe in eine speicherbare Datei.
Die speicherbaren Dateien werden dann vom übergeordneten System eingelesen und die Gesamtdaten von jedem der untergeordneten Elemente werden analysiert, bevor eine Wiederholung der vorherigen Verzweigung ausgeführt wird oder andernfalls die übergeordnete Datei angehalten wird.
Was genau passiert, wenn ich ein^C ausstelle, während einige der Kinder noch das externe Programm laufen haben? Das Parent-Perl-Skript wurde im Vordergrund aufgerufen und ich vermute, trotz Forking blieb es im Vordergrund.
Wird das SIGINT an alle Kinder übergeben, dh an die Eltern, die Kinder der Eltern und an das von den Kindern aufgerufene externe Programm?
UPDATE:
ich hinzufügen soll, scheint es, dass, wenn ich die SIGINIT ausgeben, das externe Programm mit den Kindern meines Skripts aufgerufen scheint das Signal zu erkennen und zu beenden. Aber die Kinder, oder vielleicht das Elternprogramm, machen weiter. Das ist alles unklar für mich.
UPDATE 2:
Hinsichtlich tchrist Kommentar wird das externe Programm mit system()
Perl-Befehl aufgerufen.
Tatsächlich scheint tchrists Kommentar auch die Erklärung zu enthalten, nach der ich gesucht habe. Nach etwas mehr Debugging, basierend auf dem Verhalten meines Programms, scheint es, dass SIGINT tatsächlich vom Elternteil an alle Kinder und von allen Kindern an alle ihre Kinder (das externe Programm) weitergegeben wird.
Also, was auf der Grundlage des Kommentars von tchrist zu geschehen scheint, ist, dass CTRL-C das externe Programm auslöst, das bewirkt, dass die Kinder aus dem Befehl system()
auswandern - und nichts mehr.
Obwohl ich meine Kinder überprüfen den Exit-Status von dem, was in system()
aufgerufen wurde, ging ich davon aus, dass ein STRG-C alles von der übergeordneten abtöten würde, anstatt zur Schaffung von mehr Runden der Verarbeitung führen, was ist Was ist passiert!!!
LÖSUNG (auf mein Problem):
Ich muss nur ein Signal-Handler für SIGINT in der übergeordneten erstellen. Der Signal-Handler würde dann SIGTERM an jeden der untergeordneten Objekte senden (von denen ich anmaße, dass sie auch ein SIGTERM an die untergeordneten Objekte der Kinder senden würden) und dann veranlassen, dass das übergeordnete Element ordnungsgemäß beendet wird. Obwohl diese etwas offensichtliche Lösung wahrscheinlich Dinge behoben hätte, wollte ich meine falsche Auffassung über das Verhalten von SIGINT in Bezug auf das Forking in Perl verstehen.
Sie haben nicht gesagt, ob Sie Ihre eigene Version von 'system()' oder eine Pipe öffnen oder Backticks, oder ob Sie Perls verwenden. Wenn Sie Perls verwenden, IGNORIERT jedes Elternteil - dasjenige, das "System" nennt, nicht das von ihm aufgerufene - SIGINT und SIGQUIT, während die Kinder laufen. Wenn Sie Ihre eigenen Rollen haben, müssen Sie selbst über diese Dinge nachdenken. Überlegen Sie, was passiert, wenn Sie 'system (" vi somefile ")' verwenden und während einer langen Suche in 'vi' auf^C drücken: nur' vi' nimmt einen (nicht-tödlichen) SIGINT; Der Elternteil ignoriert es. Das ist richtiges Verhalten. – tchrist
Danke, tchrist. Mache dies zu einer Antwort, damit ich es als akzeptiert markieren kann. – EMiller