C Programmazione

Segnali POSIX con programmazione in C

Segnali POSIX con programmazione in C
Possiamo definire un segnale come un'attività che viene attivata per allertare un'operazione o un thread ogni volta che il tempo di arrivo per una certa situazione significativa. Ogni volta che una procedura o un thread riconosce un segnale, la procedura o il thread interromperà qualsiasi cosa stia facendo e intraprenderà un'azione immediata. Nel coordinamento tra processi, il segnale può essere efficace. In questa guida studierai i gestori di segnale in Linux attraverso il linguaggio C.

Segnali standard o regolari:

Il file di intestazione "segnale".h' ha segnali specificati in esso come una macro costante. Il titolo del segnale inizia con "SIG" ed è preceduto da una breve panoramica del segnale. Di conseguenza, ogni segnale ha un valore numerico distinto. Il codice del programma dovrebbe utilizzare il nome del segnale, non diversi segnali. La causa è che il numero di segnali può variare a seconda del sistema, ma l'interpretazione dei nomi è standard. Di seguito sono riportati alcuni segnali regolari con la loro funzionalità definita.

SIGHUP:

Questo segnale interromperà l'elaborazione. Il segnale SIGHUP viene espulso per indicare la dissociazione del terminale utente, probabilmente a causa di una comunicazione remota interrotta o riagganciata.

SIGINT:

Interromperà il processo. Il segnale SIGINT viene ricevuto ogni volta che l'utente inserisce il tasto INTR (di solito Ctrl + C).

SIGQUIT:

Si fermerà o uscirà dall'elaborazione. Il segnale SIGQUIT viene ricevuto ogni volta che l'utente inserisce il tasto QUIT (di solito Ctrl + \).

SIGILLO:

Viene eseguito quando è stato eseguito un comando illecito. Il segnale SIGILL viene creato ogni volta che viene fatto uno sforzo per eseguire un comando spazzatura o privilegiato. Ogni volta che lo stack trabocca e la macchina ha problemi nell'esecuzione di un controller di segnale, è possibile creare anche SIGILL.

SIGTRAP:

Viene chiamato quando viene eseguita un'istruzione trace trap trap. Il segnale SIGTRAP viene creato da un comando breakpoint e da un altro comando trap. Il debugger utilizza un tale segnale.

SIGABRT:

Si chiama segnale di interruzione. Il segnale SIGABRT viene creato chiamando il metodo abort(). Tale segnale viene utilizzato per evidenziare l'imprecisione osservata dal codice sopracitato e registrato dalla chiamata al metodo abort().

SIGFPE:

Eccezione per virgola mobile; Il segnale SIGFPE viene prodotto quando si verifica un errore matematico catastrofico.

SIGUSR1 e SIGUSR2:

I segnali SIGUSR1 e SIGUSR2 possono essere utilizzati nel modo che preferisci. È utile per una facile interazione tra processi creare un gestore di segnale per tali segnali nell'applicazione che riceve il segnale.

Comportamento predefinito dei segnali:

Esiste un comportamento o un'azione standard per ogni segnale ed è possibile regolare il comportamento predefinito utilizzando la funzione del gestore. Il comportamento automatico del segnale SIGKILL e SIGABRT non può essere modificato o trascurato.

Termine: Terminerà l'operazione.

Nucleo: Verrà generato un documento core dump e l'operazione verrà terminata.

Accendi: Il processo trascurerebbe un segnale.

Fermare: Fermerà l'operazione.

Continua: L'operazione sarà sostenuta dall'arresto.

Gestione del segnale:

Il processo ha una preferenza di comportamento per un segnale quando viene riconosciuto. Il processo può comportarsi come segue:

Il segnale viene automaticamente eliminato quando il comportamento del segnale definito viene trascurato.

Utilizzando metodi come signal o sigaction, il codice può registrare una funzione del gestore. Si chiama catturare un segnale da un gestore.

Se un segnale non viene trattato o trascurato, può verificarsi l'azione standard.

È possibile definire la funzione di gestione del segnale come:

$ Int signal() int signum, void (*funk)(int))

Quando l'elaborazione ottiene un segnale signum, il metodo signal() può chiamare il metodo 'func'. Signal() ripristina un puntatore al metodo 'func' se è prospero o viene restituita un'eccezione a errno e -1 invece.

Il puntatore 'func' può avere tre valori:

SIG_DFL: Questo è un puntatore al metodo standard SIG DFL(), definito nell'intestazione.h documento utilizzato per ottenere il comportamento standard del segnale.

SIG_IGN: Questo è un riferimento al metodo ignore di SIG IGN(), specificato nell'intestazione.h documento.

Puntatore al metodo del gestore definito dall'utente: Il tipo di metodo del gestore definito dall'utente void(*)(int), implica che la categoria restituita è void e che l'argomento solitario è int.

Crea un nuovo file "segnale".c' e scrivi sotto il codice del gestore del segnale al suo interno.

Collega il segnale.c file con gcc.

Durante l'esecuzione del segnale.c, abbiamo un ciclo infinito che si esegue nel metodo principale. Premendo CTRL+C, è stato avviato il metodo del gestore e l'esecuzione del metodo principale è stata interrotta. L'elaborazione del metodo principale è continuata dopo il completamento del metodo del gestore. Premendo Ctrl+\, l'operazione termina.

Ignora segnale:

Per ignorare il segnale, creare un file 'segnale'.c' e scrivi sotto il codice in esso.

Lega l'ignora.c file con gcc.

Esegui il segnale.c file. Tocca CTRL+C, viene creato il segnale SIGNIT; tuttavia, il comportamento non viene notato perché il metodo del gestore è enumerato nel metodo SIG_IGN().

Registra nuovamente il gestore del segnale:

Per registrare nuovamente il gestore del segnale, crea un nuovo file "rereg".c' e inscrivici il codice seguente:

Associa il rereg.c file con gcc.

Eseguire il rereg.c file. Mentre si preme per la prima volta il metodo del gestore CTRL+C viene sollevato e il gestore del segnale viene nuovamente registrato su SIG_DFL. Premendo nuovamente CTRL+C, l'esecuzione è stata interrotta.

Invia segnali usando Raise():

Crea un file "invia".c' e aggiungi il codice seguente. Per inviare segnali al metodo chiamante, viene utilizzato il metodo raise().

Riguarda l'invio.c file con gcc.

Il processo utilizza il metodo raise() per trasmettere da solo il segnale SIGUSR1.

Invia segnali usando Kill():

Aggiungi il codice sottostante in 'raise.c'. Usa il metodo kill() per inviare segnali al gruppo di processi.

Collega il rilancio.c file con gcc.

Utilizzando il metodo kill(), il processo indirizza il segnale SIGUSR1 al suddetto.

Interazione genitore-figlio:

Per guardare l'interazione genitore-figlio, scrivi il codice seguente in un file.

Lega la comunicazione.c file con gcc.

Il metodo Fork()/ genera figlio, ripristina zero nel processo figlio e l'ID figlio in padre.

Conclusione:

In questa guida abbiamo visto come creare, gestire, inviare, ignorare, registrare nuovamente e utilizzare il segnale per l'interazione tra processi in Linux.

OpenTTD vs Simutrans
Creare la tua simulazione di trasporto può essere divertente, rilassante ed estremamente allettante. Ecco perché devi assicurarti di provare quanti pi...
Tutorial OpenTTD
OpenTTD è uno dei giochi di simulazione aziendale più popolari in circolazione. In questo gioco, devi creare una meravigliosa attività di trasporto. T...
SuperTuxKart per Linux
SuperTuxKart è un fantastico titolo progettato per offrirti l'esperienza di Mario Kart gratuitamente sul tuo sistema Linux. È piuttosto impegnativo e ...