Segnali posix in c

Segnali posix in c

“Durante la guida sul ciglio della strada, cosa fai quando hai un incontro con un segnale rosso? Smetti di guidare per un po 'per aspettare il tuo turno fino a quando il segnale diventa verde. Allo stesso modo, quando un segnale ha un colore arancione, continui a guidare e non fermarti mai. I segnali Posix funzionano allo stesso modo del segnale del traffico. La libreria di segnale Posix ha escogitato una funzione molto semplice da utilizzare nel codice C per generare segnali, far aspettare i tuoi programmi per la loro esecuzione e molti altri. Questo articolo dimostrerebbe tutte quelle funzioni del segnale. Abbiamo iniziato i nostri esempi con la creazione e l'apertura di un file C."

Esempio 01

All'interno del primo esempio di segnali posix, dimostreremo l'uso di una semplice funzione di segnale () per creare e invocare un segnale. Pertanto, abbiamo usato il segnale.H Libreria di C per utilizzare le funzioni del segnale, lo stdio.La libreria H viene utilizzata per l'uscita standard e le funzioni di input e l'UNISTD.La libreria H viene utilizzata per utilizzare le strutture definite dall'utente, i.e., funzioni. Il codice contiene una semplice funzione di gestore denominata "Handle" con argomento di tipo intero "s."Questa variabile" S "funzionerà come segnale. Contiene una semplice istruzione printf per inviare un segnale "arresto" all'utente.

La funzione principale () inizia creando un segnale utilizzando la funzione "segnale" qui mentre utilizza la sua opzione "Sigint" per inizializzare un segnale e la funzione "Handle" per utilizzare questa funzione come gestore del segnale. Il loop "per" inizia da "1", ma non ha fine, io.e., Si farà incremento ma non si fermerà mai fino a quando non lo fai da solo uscendo dal programma. Il ciclo contiene un'istruzione printf di c per visualizzare che siamo attualmente nella funzione principale (). Utilizzando il collegamento CTRL+C, possiamo invocare la funzione Handle () per visualizzare un messaggio di segnale.

Ad ogni iterazione del ciclo "per", dorme per 5 secondi e poi viene incrementato. Eseguiamo il nostro codice di segnale C dopo aver salvato e rimosso correttamente i suoi errori.

#includere
#includere
#includere
void handle (int s)
printf ("\ nstop ... \ n");

int main ()
segnale (Sigint, maniglia);
per (int i = 1 ;; i ++)
printf ("%d: main \ n", i);
sonno (5);
restituzione 0;

Quando esegui questo programma con il compilatore di "C" ed eseguilo con ".UN/.fuori ”query, vedrai un'esecuzione infinita del thread principale ().

Quando abbiamo premuto "Ctrl+C" per invocare la funzione del gestore del segnale, la funzione Handle () viene eseguita e ha visualizzato "Stop" al momento. Successivamente, il controllo va di nuovo al metodo principale () e inizia di nuovo a eseguire la sua istruzione printf usando il ciclo infinito "per". Abbiamo premuto il tasto di scelta rapida "ctrl+z" per fermare con forza questo programma.

Supponiamo che tu voglia ignorare il segnale invocato da un utente. Questo può essere fatto utilizzando il parametro Sig_IGN della funzione Signal () senza utilizzare alcuna funzione di gestore. Stiamo usando lo stesso codice con una leggera modifica della funzione Signal (). Utilizzando questa funzione, quando un utente invoca un segnale utilizzando il collegamento "Ctrl+C", il programma ignorerà il segnale e continuerà a eseguire il thread di funzione principale (). Salviamo rapidamente ed eseguiamo questo programma per vedere l'output.

#includere
#includere
#includere
int main ()
segnale (sigint, sig_ign);
per (int i = 1 ;; i ++)
printf ("%d: ignorare il segnale ... \ n", i);
sonno (5);
restituzione 0;

Dopo questa esecuzione del codice, l'istruzione Funzione Printf () principale () continua a eseguire anche dopo aver utilizzato il collegamento "Ctrl+C". Quindi, abbiamo fermato con forza il programma alla fine.

Esempio 02

Se si desidera sollevare automaticamente un segnale per il tuo programma C senza utilizzare la chiave di scelta rapida CTRL+C, puoi farlo anche utilizzando la funzione di sollevamento () della libreria del segnale. Pertanto, abbiamo aggiornato il codice dal primo esempio e aggiunto di nuovo una funzione Handle (). La funzione principale () inizia con la creazione di un segnale usando la funzione Signal () passandola un'opzione "Sigusr1" con la funzione "Handle" nei parametri. Questa opzione Sigussr1 è la chiave per generare un segnale automatico. Il ciclo "for" dorme per 10 secondi dopo aver eseguito l'istruzione printf e quindi chiama la funzione sollevato () con l'opzione Sigusr1 per generare un segnale automatico chiamando la funzione "manage". Questo è tutto; Siamo pronti a eseguire questo programma per ora.

#includere
#includere
#includere
void handle (int s)
printf ("\ nraise ... \ n");
sonno (5);

int main ()
segnale (Sigusr1, maniglia);
per (int i = 1 ;; i ++)
printf ("%d: main \ n", i);
sonno (10);
sollevare (Sigusr1);
restituzione 0;

Dopo la raccolta riuscita, l'esecuzione ha luogo. Viene eseguito il thread principale () GPT e il programma dorme per 10 secondi mentre è in loop.

Dopo 10 secondi, la funzione di aumento è stata invocata per generare un segnale automatico chiamando la funzione della maniglia. L'esecuzione dorme per i successivi 5 secondi nella funzione Handle.

Il controllo viene restituito alla funzione principale () "Loop" e questo processo continua fino a quando non si esce dal programma volentieri utilizzando il collegamento CTRL+Z.

Proprio come il tuo segnale automatico per il tuo programma, puoi anche uccidere il segnale dopo aver invocato e inviare il segnale a un gruppo di elaborazione. In altre parole, la funzione "uccisione" della libreria dei segnali POSIX C è stata utilizzata per inviare avvisi al gruppo del programma. Pertanto, abbiamo aggiornato il nostro programma principale insieme alla sua funzione Handle nel codice di immagine sopra visualizzato. L'oggetto PID_T viene utilizzato per creare un ID "P" per il processo. La funzione Signal () viene chiamata qui per creare un segnale attraverso l'uso della funzione Handle () definita prima dalla funzione principale.

La funzione getpid () viene chiamata all'interno del ciclo "per" per ottenere l'ID processo di questo thread e salvarlo in una variabile "P". Questo ID di processo "P" viene passato alla funzione "kill" insieme all'opzione Sigusr1 per uccidere il segnale e inviare il suo rapporto a un gruppo di avanzamento. Quindi, un programma dorme per 8 secondi e stampe "indietro" mentre il loop continua.

#includere
#includere
#includere
void handle (int s)
printf ("\ nstop ... \ n");

int main ()
pid_t p;
segnale (Sigusr1, maniglia);
per (int i = 1 ;; i ++)
printf ("%d: main \ n", i);
p = getpid ();
uccidere (P, Sigusr1);
sonno (8);
printf ("Back in main \ n");
restituzione 0;

La funzione viene eseguita, invia il segnale al gruppo di processo e dorme per 8 secondi.

Il "Back in Main" è stato eseguito e il ciclo ha continuato la stessa elaborazione.

Conclusione

Questa guida ha dimostrato l'uso delle funzioni del segnale nel programma C per rendere il tuo ambiente di lavoro più efficiente. Per questo, abbiamo provato la funzione Segnale () di Posix, Kill () e sollevare () insieme alle opzioni Sigint, Sig_Inn e Sigusr1 nelle funzioni.