Segnali
Notifiche asincrone
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:
SIGINTinterruzione (Ctrl-C)SIGTERMrichiesta di terminazione ordinataSIGKILLterminazione forzata (non può essere intercettato)SIGCHLDun processo figlio ha cambiato statoSIGSEGVaccesso 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 vecchiosignal - I gestori devono essere async-signal-safe; è preferibile impostare un flag
- Invii segnali con
kill/raise; li blocchi consigprocmask - Recuperi i processi figli alla ricezione di SIGCHLD; SIGKILL e SIGSTOP non possono essere intercettati
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.