Mit sigaction(), c
War ich dabei ein wenig Lesen über sigaction()
(Quellen sind aus meinem Kurs Notizen) und ich bin mir nicht sicher, ob ich verstehe diesen text:
Den signal-Maske berechnet und installiert werden, nur für die Dauer der
der signal-handler.Standardmäßig das signal "sig" ist auch blockiert, wenn das signal Auftritt.
Einmal eine Aktion installiert ist, ein spezifisches signal mit sigaction,
es installiert bleiben, bis eine andere Aktion ist ausdrücklich erwünscht.
Bedeutet dies, dass die Standard-signal-Maske wird wiederhergestellt, nach der Rückkehr der form der signal-handler?
Auch, muss ich re-installieren Sie den handler, nachdem Sie es, als wenn ich mit signal()
?
Außerdem gibt es dieses Stück code:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void termination_handler(int signum) {
exit(7);
}
int main (void) {
struct sigaction new_action,old_action;
new_action.sa_handler = termination_handler;
sigemptyset(&new_action.sa_mask);
sigaddset(&new_action.sa_mask, SIGTERM);
new_action.sa_flags = 0;
sigaction(SIGINT, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN) {
sigaction(SIGINT,&new_action,NULL);
}
sleep(10);
return 0;
}
Also - wie genau wird SIGTERM
behandelt werden? Ich kann sehen, dass die installierte handler ist termination handler()
, aber dann SIGTERM
wurde Hinzugefügt, um die signal-Maske ohne Verwendung von sigprocmask()
. Was bedeutet das? Danke!
P. s. eine Letzte Frage: warum die if
Anweisung in main()
?
- Haben Sie jemals eigene signal-handler ? Wenn nicht, Mein Rat ist, verwenden Sie zuerst Ihre eigene signal-handler. Dann, sigaction einfach zu verstehen. If-Anweisung ist-Vergleich ( check gefangen signal erwartet wird eine ). Und, Antwort für die erste Frage liegt auf ` die Dauer des signal-handler`.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie uns versuchen zu verstehen, was passiert mit einer modifizierten version des Codes :
Also, wenn Sie Sie kompilieren und starten Sie es, und drücken Sie Strg+C, dann haben Sie die handler-Nachricht ausgeführt, und dann sind Sie wieder sofort aus dem Haupt-Schlaf. Sie können es tun, wie viele Zeit, wie Sie wollen, und der handler die Nachricht und das inloop-Nachricht wird immer noch angezeigt.
So, Sie geben eine Funktion, und sigaction hat alles, was benötigt wird, um Haken Sie das signal mit Ihrem handler.
Nun, was ist mit sigterm? Wenn Sie erhöhen Sie die sleep-Zeit in termination_handler, können Sie geben so etwas wie "pkill --signal SIGTERM ./ein.aus" nach drücken von Strg+C. Dann, was passiert? Nichts! Das SIGTERM-signal blockiert, während termination_handler ausgeführt wird. Aber sobald Sie wieder in der Haupt -, jetzt die SIGTERM wird die Anwendung töten.
(Denken Sie daran, während Sie diesen code testen, können Sie immer noch töten Sie Anwendungen, indem Sie ein SIGKILL-signal.)
Wenn Sie mehr wissen wollen, und haben mehr Spaß mit den Signalen, Sie haben die signal manuelle und die sigaction-Handbuch, die viel mehr zu erzählen. Beachten Sie, dass Sie auch die detaillierte Beschreibung der sigaction-Struktur.