Ich habe eine Live-CD, die unter Linux startet und ein kleines Bash-Skript ausführt. Das Skript sucht nach einem zweiten Programm und führt es aus (normalerweise eine kompilierte C ++ - Binärdatei).
Sie sollten in der Lage sein, das zweite Programm abzubrechen, indem Sie Ctrl+ drücken C. Was passieren sollte , ist, dass das zweite Programm anhält und das Bash-Skript die Bereinigung fortsetzt. Was tatsächlich passiert, ist, dass sowohl die Hauptanwendung als auch das Bash-Skript beendet werden. Welches ist ein Problem.
Also habe ich das trap
Builtin benutzt, um Bash anzuweisen, SIGINT zu ignorieren. Und jetzt beendet Ctrl+ Cdie C ++ - Anwendung, aber Bash setzt die Ausführung fort. Groß.
Oh ja ... Manchmal ist die "zweite Anwendung" ein anderes Bash-Skript. Und in diesem Fall macht Ctrl+ Cjetzt überhaupt nichts mehr .
Klar ist mein Verständnis, wie dieses Zeug funktioniert, falsch ... Wie steuere ich, welcher Prozess SIGINT erhält, wenn der Benutzer Ctrl+ drückt C? Ich möchte dieses Signal nur auf einen bestimmten Prozess lenken .
set -m
. Es ist ein bisschen sauberer und einfacher alssetsid
jedes Mal, wenn Sie ein Kind führen.Wie im Kommentar zu f01 erwähnt, sollten Sie SIGTERM an den untergeordneten Prozess senden. In den folgenden Skripten wird gezeigt, wie ^ C abgefangen und ein Signal an einen untergeordneten Prozess gesendet wird.
Erstens die Eltern.
traptest
Und jetzt das Kind.
Schlaflöffel
Wenn Traptest SIGTERM sendet, verhalten sich die Dinge gut, aber wenn Traptest SIGINT sendet, sieht es Sleeploop nie.
Wenn sleeploop SIGTERM abfängt und der Schlafmodus im Vordergrund ist, kann es nicht auf das Signal reagieren, bis es aus dem aktuellen Schlafzustand aufwacht. Wenn der Schlafmodus jedoch im Hintergrund ist, reagiert er sofort.
quelle
In Ihrem einleitenden Bash-Skript.
Verfolgen Sie die PID des zweiten Programms
Nimm den ZEICHEN
Wenn Sie ein SIGINT abgefangen haben, senden Sie ein SIGINT an die zweite Programm-PID
quelle