C Academy · Lezione

Segnali

Notifiche asincrone

Lezione 4 di 413 passaggi

Segnali è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Che cos'è un segnale

Un segnale è una notifica asincrona inviata a un processo per informarlo che si è verificato un evento, ad esempio quando un utente preme Ctrl-C o quando termina un processo figlio. I segnali sono una forma leggera di IPC.

Segnali comuni

Alcuni segnali che incontrerà spesso:

  • SIGINT interruzione (Ctrl-C)
  • SIGTERM richiesta di terminazione ordinata
  • SIGKILL terminazione forzata (non può essere intercettato)
  • SIGCHLD un processo figlio ha cambiato stato
  • SIGSEGV accesso non valido alla memoria

Azioni predefinite

Ogni segnale ha un'azione predefinita: terminare, terminare con core dump, ignorare, arrestare o continuare. È possibile sostituire la maggior parte di queste azioni con un gestore.

Installare un gestore

Il modo moderno e portabile per impostare un gestore è usare sigaction. Il gestore è una funzione che riceve il numero del segnale.

#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);
}

Perché non usare signal()

La vecchia funzione signal() ha un comportamento non uniforme tra i sistemi (reimpostazione del gestore, assenza di controllo su SA_RESTART). È preferibile sigaction, che ha un comportamento ben definito ed è portabile.

Funzioni async-signal-safe

Un gestore può interrompere il codice in qualsiasi momento, quindi può chiamare solo funzioni async-signal-safe come write. Chiamare printf o malloc da un gestore può causare deadlock o corruzione dei dati.

Usare un flag volatile

Un modello sicuro consiste nel far impostare al gestore un flag volatile sig_atomic_t e nel farlo controllare dal ciclo principale. In questo modo il gestore rimane minimo e sicuro.

#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(); } */

Inviare segnali

Usi kill(pid, sig) per inviare un segnale a un altro processo oppure raise(sig) per inviarne uno a sé stesso. Nonostante il nome, kill invia qualsiasi segnale, non solo quelli letali.

#include <signal.h>

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

Bloccare i segnali

Per proteggere una sezione critica, può bloccare temporaneamente i segnali con sigprocmask e un insieme di segnali. I segnali bloccati rimangono in attesa e vengono consegnati quando vengono sbloccati.

#include <signal.h>

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

Recuperare i processi figli con SIGCHLD

Quando un processo figlio termina, il kernel invia SIGCHLD. Un gestore che chiama waitpid recupera il processo figlio, impedendo la presenza di processi zombie che rimangono nella tabella dei processi.

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

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

Segnali che non possono essere intercettati

Due segnali sono assoluti: SIGKILL termina sempre il processo e SIGSTOP lo arresta sempre. Non possono essere intercettati, bloccati o ignorati, fornendo al sistema un modo garantito per controllare i processi.

Verifica rapida

Verifichi la sua comprensione dei segnali.

Riepilogo

Ha imparato a usare i segnali per le notifiche asincrone.

  • Installi i gestori con sigaction, non con il vecchio signal
  • I gestori devono essere async-signal-safe; è preferibile impostare un flag
  • Invii segnali con kill/raise; li blocchi con sigprocmask
  • Recuperi i processi figli alla ricezione di SIGCHLD; SIGKILL e SIGSTOP non possono essere intercettati
Gratis per iniziare

Impara C con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
39
Lezioni
144

Domande Frequenti

La lezione «Segnali» è gratuita?

Sì — il testo completo di «Segnali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «Segnali»?

Notifiche asincrone Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Segnali»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Pipe
  2. Memoria condivisa
  3. Code di messaggi
  4. Segnali
← Torna a C Academy