#include #include #include // Der einzige Weg, dieses Programm garantiert zu beenden, ist durch das Senden // von SIGKILL (z.B. mittels kill(1)). Dafuer muss man allerdings die PID des // Prozesses ermitteln. Dazu kann man sich alle Prozesse anzeigen lassen (`ps // aux`) und die Ausgabe nach dem Programm "unkillable" durchsuchen: // // ps aux | grep unkillable // // Die erste Spalte nach dem Benutzernamen ist dann die PID: // // kill -KILL // kill -9 # alternativ // // Alternativ kann man auch pkill(1) verwenden, was alle Prozesse toetet, die // ein Programm mit dem jeweiligen Namen ausfuehren: // // killall 02-unkillable # je nachdem, wie das Programm heisst // // Dies geht uebrigens nur, wenn der Prozess von einem selbst ist; man kann // damit nicht einfach so die Prozesse von anderen Benutzern (im CIP) toeten. ;) static void die(const char *msg) { perror(msg); exit(EXIT_FAILURE); } static void handle(int signum) { // In einer Signalbehandlungsfunktion Funktionen wie printf(3) aufzurufen // ist eigentlich *falsch*. Den Grund dafuer erfahren wir in der naechsten // Tafeluebung. Damit es simpel bleibt, machen wir es trotzdem. ;) printf("nice try\n"); } int main() { struct sigaction act = { //.sa_handler = SIG_IGN // Einfacher Weg: das Signal direkt ignorieren. // "Umstaendlicher" Weg: das Signal indirekt ignorieren, indem wir eine // Signalbehandlungsfunktion festlegen, die "nichts" macht. Sorgt fuer // eine etwas illustrativere Darstellung. ;) .sa_handler = handle }; // Mit "SIG_IGN" nicht notwendig (aber schadet auch nicht, da es ignoriert // wird); nur bei expliziter Signalbehandlungsfunktion muss sa_mask auf // einen sinnvollen Wert initialisiert werden. sigemptyset(&act.sa_mask); // Fehlerbehandlung von sigaction(2) ist eigentlich nicht notwendig. // Blockiert Ctrl + C. if (sigaction(SIGINT, &act, NULL)) die("sigaction"); // Blockiert Ctrl + \. if (sigaction(SIGQUIT, &act, NULL)) die("sigaction"); // Blockiert das Standardsignal, das von kill(1) gesendet wird. if (sigaction(SIGTERM, &act, NULL)) die("sigaction"); // Blockiert Ctrl + Z... ;) if (sigaction(SIGTSTP, &act, NULL)) die("sigaction"); // Versucht, SIGKILL zu blockieren, was allerdings nicht erlaubt ist. // Deswegen auch kein die() hier, sondern nur perror(3). if (sigaction(SIGKILL, &act, NULL)) perror("sigaction(SIGKILL)"); // Damit sich dieses Programm nicht einfach direkt beendet, nachdem die // Signale blockiert wurden. :) while (1) {} }