Unix / Linux - Segnali e Trappole
Ciao a tutti, futuri maghi dell'informatica! Oggi esploriamo il mondo affascinante dei segnali e delle trappole di Unix/Linux. Non preoccupatevi se siete nuovi alla programmazione - vi guiderò in questa avventura passo per passo, proprio come ho fatto per centinaia di studenti negli anni della mia insegnanza. Quindi, mettiamoci in cammino insieme!
Cos'è un Segnale?
Immaginate di essere in una cucina di un ristorante affollato. Il cuoco (chiamiamolo Cuoco Unix) ha bisogno di comunicare rapidamente con il suo staff. Invece di urlare sopra il rumore, utilizza un sistema di segnali manuali. Questo è più o meno ciò che sono i segnali nel mondo di Unix/Linux - un modo per i processi comunicare rapidamente ed efficientemente.
I segnali sono interruzioni software inviate a un programma per indicare che è avvenuto un evento importante. Questi eventi possono variare da richieste degli utenti a circostanze di runtime eccezionali.
Elenco dei Segnali
Proprio come il Cuoco Unix potrebbe avere segnali manuali diversi per "più sale", "affrettati" o "fai una pausa", i sistemi Unix/Linux hanno una varietà di segnali per scopi diversi. Ecco alcuni dei più comuni:
Nome del Segnale | Numero del Segnale | Descrizione |
---|---|---|
SIGHUP | 1 | Rilevato hangup sul terminale di controllo o morte del processo di controllo |
SIGINT | 2 | Interruzione dalla tastiera (Ctrl+C) |
SIGQUIT | 3 | Quit dalla tastiera (Ctrl+) |
SIGKILL | 9 | Segnale di kill (non può essere catturato o ignorato) |
SIGTERM | 15 | Segnale di terminazione |
SIGSTOP | 17, 19, 23 | Ferma il processo (non può essere catturato o ignorato) |
Azioni Predefinite
Quando un segnale viene inviato a un processo, il processo eseguirà un'azione predefinita a meno che non venga istruito diversamente. Queste azioni predefinite sono come le risposte istintive del nostro staff di cucina. Ad esempio:
- Terminare il processo
- Ignorare il segnale
- Scaricare il core
- Fermare il processo
- Continuare un processo fermato
Invio dei Segnali
Ora, impariamo come inviare questi segnali. In Unix/Linux, utilizziamo il comando kill
per inviare segnali ai processi. Non fatevi ingannare dal nome - kill
non sempre termina i processi; è solo un modo per inviare segnali.
Ecco come utilizzarlo:
kill -signal_name process_id
Ad esempio, per inviare un segnale SIGTERM al processo 1234:
kill -SIGTERM 1234
Oppure, utilizzando il numero del segnale:
kill -15 1234
Cattura dei Segnali
Cosa succederebbe se il nostro staff di cucina potesse decidere come rispondere ai segnali del Cuoco Unix invece di seguire sempre la reazione predefinita? Questo è ciò che la cattura dei segnali permette nella programmazione.
Negli script di shell, utilizziamo il comando trap
per catturare i segnali e specificare cosa fare quando vengono ricevuti. Ecco la sintassi di base:
trap command signal(s)
Ecco un esempio:
#!/bin/bash
trap "echo Bonjour!" SIGINT SIGTERM
echo "It's a trap!"
while true
do
sleep 60
done
In questo script, se riceve SIGINT o SIGTERM, stamperà "Bonjour!" invece di terminare. È come dire al nostro staff di cucina: "Quando il cuoco segnala per fermarsi, dice 'Bonjour!' invece di fermarsi davvero."
Pulizia dei File Temporanei
Un uso comune delle trappole è pulire i file temporanei prima che uno script esca. Ecco un esempio:
#!/bin/bash
# Crea un file temporaneo
temp_file=$(mktemp)
# Imposta una trappola per rimuovere il file temporaneo all'uscita
trap "rm -f $temp_file" EXIT
# Usa il file temporaneo
echo "Hello, World!" > $temp_file
cat $temp_file
# Il file temporaneo sarà automaticamente rimosso quando lo script esce
Questo script crea un file temporaneo, scrive su di esso, legge da esso e poi lo rimuove automaticamente quando lo script esce, grazie alla trappola.
Ignorare i Segnali
A volte, potresti voler ignorare determinati segnali. Nella nostra analogia della cucina, questo sarebbe come dire al cuoco: "Non mattera quante volte segnali per più sale, non aggiungerò più sale!"
Ecco come ignorare un segnale:
trap "" SIGINT
Questo dice allo script di non fare nulla quando riceve un segnale SIGINT.
Ripristino delle Trappole
Cosa succederebbe se volessi tornare al comportamento predefinito dopo aver catturato un segnale? Puoi ripristinare una trappola così:
trap - SIGINT
Questo rimuove la trappola per SIGINT, tornando al comportamento predefinito.
Ecco un esempio più completo:
#!/bin/bash
# Inizialmente, cattura SIGINT
trap "echo You can't stop me!" SIGINT
echo "Try to stop me with Ctrl+C..."
sleep 10
# Ora, ripristina la trappola
trap - SIGINT
echo "Okay, now you can stop me with Ctrl+C..."
sleep 10
echo "If you see this, you didn't stop me!"
Questo script cattura SIGINT, poi ripristina la trappola dopo 10 secondi. È come dire al nostro staff di cucina: "Ignora il segnale di stop per 10 secondi, poi torna alla normalità."
Ecco fatto, gente! Abbiamo viaggiato attraverso il paese dei segnali e delle trappole di Unix/Linux. Ricorda, la pratica rende perfetti. Prova a scrivere i tuoi script, gioca con diversi segnali, e presto condurrai la tua orchestra di processi come un vero maestro. Buon coding!
Credits: Image by storyset