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!

Unix / Linux - Signals and Traps

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:

  1. Terminare il processo
  2. Ignorare il segnale
  3. Scaricare il core
  4. Fermare il processo
  5. 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