C Programmazione

Come usare SIGALRM e la funzione di allarme in linguaggio C?

Come usare SIGALRM e la funzione di allarme in linguaggio C?
Il allarme() la funzione viene utilizzata per generare a SIGALRM segnale dopo un periodo di tempo specificato. In questo articolo, ti mostreremo come usare allarme() funzione e SIGALRM segnale in Linux. Quindi iniziamo.

Sintassi

unsigned int alarm (unsigned int secondi)

La funzione è definita in unistd.h file di intestazione.

argomenti

La funzione accetta un argomento, secondi. Dopo secondi sono trascorsi secondi dalla richiesta del allarme() funzione, il SIGALRM il segnale viene generato. Il comportamento predefinito al ricevimento di SIGALRM è terminare il processo. Ma possiamo catturare e gestire il segnale. Vedi i dettagli sulla gestione del segnale.

Il allarme() la funzione restituirà un valore diverso da zero, se è stato precedentemente impostato un altro allarme e il valore è il numero di secondi rimanenti per l'allarme programmato precedente dovuto alla consegna. Altrimenti allarme() restituirà zero.

Esempio 1.c:

#includere
#includere
#includere
 
void sig_handler(int signum)
 
printf("Funzione del gestore interno\n");

 
int main()
 
signal(SIGALRM,sig_handler); // Registra il gestore del segnale
 
allarme(2); // Allarme programmato dopo 2 secondi
 
for(int i=1;;i++)
 
printf("%d : All'interno della funzione principale\n",i);
dormire (1); // Ritardo di 1 secondo

restituisce 0;

Nello screenshot dell'output di Esempio 1.c, il programma viene eseguito utilizzando il comando time, in modo da poter avere una panoramica del tempo di esecuzione del programma. Abbiamo osservato che nella funzione principale chiamiamo allarme() funzione, programmata per 2 secondi. Quindi, il ciclo for è in esecuzione, dopo 2 secondi viene chiamata la funzione sig_handler e l'esecuzione della funzione principale viene messa in pausa. Dopo l'esecuzione della funzione sig_handler, nella funzione principale viene ripresa l'esecuzione del ciclo resume. Qui usiamo la funzione sleep per ritardare in modo che possiamo capire il flusso dell'esecuzione. Il ciclo for è un ciclo infinito, quando premiamo un tasto di interruzione (Ctrl+C), l'esecuzione si fermerà.

Generazione SIGALRM usando segnale() la funzione non può essere impilata. Solo uno SIGALRM la generazione può essere programmata. Chiamate successive di segnale() funzione resetta la sveglia del processo di chiamata calling.

Esempio2.c:

#includere
#includere
#includere
 
void sig_handler(int signum)
 
printf("Funzione del gestore interno\n");

 
int main()
 
signal(SIGALRM,sig_handler); // Registra il gestore del segnale
 
allarme(4); // Allarme programmato dopo 4 secondi
allarme(1); // Allarme programmato dopo 1 secondo
 
for(int i=1;;i++)
 
printf("%d : All'interno della funzione principale\n",i);
dormire (1); // Ritardo di 1 secondo

 
restituisce 0;

Nello screenshot dell'output di Esempio2.c, possiamo vedere che il programma è stato eseguito per più di 7 secondi ma il primo allarme programmato dopo 4 secondi non sta chiamando la funzione handler. Il secondo allarme che è stato programmato dopo 1 secondo viene ripristinato l'allarme.

Se il valore dell'argomento secondi è zero, qualsiasi richiesta di allarme precedentemente effettuata viene annullata.

Esempio3.c:

#includere
#includere
#includere
 
void sig_handler(int signum)
 
printf("Funzione del gestore interno\n");

 
int main()
 
signal(SIGALRM,sig_handler); // Registra il gestore del segnale
 
allarme(2); // Allarme programmato dopo 2 secondi
allarme(0); // Annullato l'allarme precedente
 
for(int i=1;;i++)
 
printf("%d : All'interno della funzione principale\n",i);
dormire (1); // Ritardo di 1 secondo

 
restituisce 0;

Nello screenshot dell'output di Esempio3.c, possiamo vedere che il primo allarme programmato dopo 2 secondi viene annullato a causa del secondo allarme per 0 secondi.

Nel Esempio4.c vedremo quanto continuamente possiamo impostare una sveglia ogni 2 secondi.

Esempio4.c:

#includere
#includere
#includere
 
void sig_handler(int signum)
 
printf("Funzione del gestore interno\n");
 
allarme(2); // Pianifica un nuovo allarme dopo 2 secondi

 
int main()
 
signal(SIGALRM,sig_handler); // Registra il gestore del segnale
 
allarme(2); // Pianifica il primo allarme dopo 2 secondi
 
for(int i=1;;i++)
 
printf("%d : All'interno della funzione principale\n",i);
pausa(); // aspetta che il segnale venga gestito

 
restituisce 0;

Nello screenshot dell'output di Esempio4.c, possiamo vedere che l'allarme è continuo ogni 2 secondi. Resettiamo l'allarme nella funzione sig_handler.

Nel Esempio5.c vedremo come possiamo ritardare la sveglia già programmata. Useremo il segnale SIGINT per l'interruzione. Quando l'utente digita Ctrl+C sulla tastiera, SIGINT il segnale genererà.

Esempio5.c:

#includere
#includere
#includere
 
void sig_handler(int signum)
 
if(signum == SIGALRM)         //gestore del segnale per SIGALRM
 
printf("Funzione del gestore interno per SIGALRM\n");
allarme(2);

if(signum == SIGINT)         // gestore del segnale per SIGINT
printf("\nRiposo per 5 secondi... \n");
allarme(5);

 

 
int main()
 
signal(SIGALRM,sig_handler); // Registra il gestore del segnale per SIGALRM
signal(SIGINT,sig_handler); // Registra il gestore del segnale per SIGINT
 
allarme(2); // Pianifica il primo allarme dopo 2 secondi
 
for(int i=1;;i++)
 
printf("%d : All'interno della funzione principale\n",i);
pausa(); // aspetta che il segnale venga gestito

 
restituisce 0;

Nello screenshot dell'output di Esempio5.c, possiamo vedere che quando l'utente digita Ctrl+C l'allarme viene ripristinato 5 secondi. In questo programma abbiamo utilizzato una sola funzione handler per due segnali diversi ma nella funzione handler è stato verificato per quale segnale viene chiamata la funzione handler.

Conclusione:

Quindi, abbiamo visto come impostare la funzione di allarme per l'attivazione del segnale, come ripristinare l'allarme, come annullare l'allarme già programmato.

Come utilizzare Xdotool per stimolare i clic del mouse e le sequenze di tasti in Linux
Xdotool è uno strumento da riga di comando gratuito e open source per simulare i clic del mouse e le sequenze di tasti. Questo articolo tratterà una b...
I 5 migliori mouse per computer ergonomici per Linux
L'uso prolungato del computer provoca dolore al polso o alle dita?? Soffri di rigidità articolare e devi continuamente stringerti la mano? Senti un do...
Come modificare le impostazioni del mouse e del touchpad utilizzando Xinput in Linux
La maggior parte delle distribuzioni Linux viene fornita con la libreria "libinput" per impostazione predefinita per gestire gli eventi di input su un...