0Pricing
C Academy · Lektion

Signale

Asynchrone Benachrichtigungen

Signale ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Signal

Ein Signal ist eine asynchrone Benachrichtigung, die an einen Prozess gesendet wird, um ihn über ein eingetretenes Ereignis zu informieren, etwa wenn ein Benutzer Strg-C drückt oder ein Kindprozess beendet wird. Signale sind eine leichtgewichtige Form der IPC.

Häufige Signale

Einige Signale, denen Sie häufig begegnen werden:

  • SIGINT Unterbrechung (Strg-C)
  • SIGTERM höfliche Aufforderung zur Beendigung
  • SIGKILL erzwungenes Beenden (kann nicht abgefangen werden)
  • SIGCHLD ein Kindprozess hat seinen Zustand geändert
  • SIGSEGV ungültiger Speicherzugriff

Standardaktionen

Jedes Signal hat eine Standardaktion: beenden, beenden und Core-Dump erzeugen, ignorieren, anhalten oder fortsetzen. Die meisten davon können Sie mit einem Handler überschreiben.

Einen Handler installieren

Die moderne, portable Methode zum Einrichten eines Handlers ist sigaction. Der Handler ist eine Funktion, die die Signalnummer entgegennimmt.

#include <signal.h>
#include <stdio.h>

void on_signal(int sig) {
    /* note: printf is not async-signal-safe; for demo only */
    write(1, "caught\n", 7);
}

int install(void) {
    struct sigaction sa = {0};
    sa.sa_handler = on_signal;
    return sigaction(SIGINT, &sa, NULL);
}

Warum nicht signal()

Die alte Funktion signal() verhält sich auf verschiedenen Systemen uneinheitlich (Zurücksetzen des Handlers, keine Kontrolle über SA_RESTART). Verwenden Sie vorzugsweise sigaction, dessen Verhalten wohldefiniert und portabel ist.

Async-Signal-sichere Funktionen

Ein Handler kann Ihren Code an jeder beliebigen Stelle unterbrechen und darf daher nur async-signal-sichere Funktionen wie write aufrufen. Der Aufruf von printf oder malloc in einem Handler kann zu Deadlocks oder Speicherbeschädigungen führen.

Ein volatile-Flag verwenden

Ein sicheres Muster: Der Handler setzt ein volatile sig_atomic_t-Flag, und die Hauptschleife prüft es. Dadurch bleibt der Handler klein und sicher.

#include <signal.h>

volatile sig_atomic_t stop = 0;

void handler(int sig) {
    stop = 1; /* only set a flag */
}
/* main loop: while (!stop) { do_work(); } */

Signale senden

Verwenden Sie kill(pid, sig), um ein Signal an einen anderen Prozess zu senden, oder raise(sig), um eines an sich selbst zu senden. Trotz des Namens sendet kill jedes Signal, nicht nur tödliche.

#include <signal.h>

int notify(int pid) {
    return kill(pid, SIGTERM); /* ask process to terminate */
}

Signale blockieren

Um einen kritischen Abschnitt zu schützen, können Sie Signale mit sigprocmask und einer Signalmenge vorübergehend blockieren. Blockierte Signale bleiben ausstehend und werden zugestellt, sobald sie nicht mehr blockiert sind.

#include <signal.h>

void block_int(void) {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigprocmask(SIG_BLOCK, &set, NULL);
}

Kindprozesse mit SIGCHLD aufräumen

Wenn ein Kindprozess beendet wird, sendet der Kernel SIGCHLD. Ein Handler, der waitpid aufruft, räumt den Kindprozess auf und verhindert Zombie-Prozesse, die in der Prozesstabelle verbleiben.

#include <signal.h>
#include <sys/wait.h>

void reap(int sig) {
    while (waitpid(-1, NULL, WNOHANG) > 0)
        ; /* reap all finished children */
}

Signale, die nicht abgefangen werden können

Zwei Signale sind unumstößlich: SIGKILL beendet den Prozess immer, und SIGSTOP hält ihn immer an. Sie können weder abgefangen noch blockiert oder ignoriert werden. Dadurch verfügt das System über eine garantierte Möglichkeit, Prozesse zu steuern.

Kurze Überprüfung

Testen Sie Ihr Verständnis von Signalen.

Zusammenfassung

Sie haben Signale zur asynchronen Benachrichtigung kennengelernt.

  • Installieren Sie Handler mit sigaction, nicht mit dem alten signal
  • Handler müssen async-signal-sicher sein; setzen Sie vorzugsweise ein Flag
  • Senden Sie Signale mit kill/raise; blockieren Sie sie mit sigprocmask
  • Räumen Sie Kindprozesse bei SIGCHLD auf; SIGKILL und SIGSTOP können nicht abgefangen werden

Häufig gestellte Fragen

Ist die Lektion „Signale“ kostenlos?

Ja — der vollständige Text von „Signale“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Signale“?

Asynchrone Benachrichtigungen Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C Academy zu starten?

Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Signale“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?

Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Pipes
  2. Shared Memory
  3. Message Queues
  4. Signale
← Zurück zu C Academy