Meccanismi di timer con C e Linux
CasaCasa > Blog > Meccanismi di timer con C e Linux

Meccanismi di timer con C e Linux

Mar 08, 2023

Ottieni un controllo capillare sulle funzioni di temporizzazione utilizzando Linux e C.

I meccanismi di timer consentono di pianificare il kernel del sistema operativo per avvisare un'applicazione quando è trascorso un tempo predeterminato. In genere li utilizzerai fornendo due informazioni. Innanzitutto, dovrai specificare quanto tempo dovrebbe impiegare il timer prima della notifica. In secondo luogo, dovrai preparare una funzione di callback che agisca quando si verifica tale notifica.

I meccanismi timer nei sistemi basati su Linux e Unix si sono evoluti per soddisfare varie esigenze. Approcci diversi possono aiutarti a risolvere diversi tipi di problemi. Tuttavia, vedrai spesso la prima versione del fileallarme()meccanismo ancora in uso.

La funzione sveglia è il modo più semplice per utilizzare un timer; ecco il suo prototipo:

Utilizzando questo metodo è possibile specificare solo l'ora in secondi interi. Allo scadere del tempo, il sistema operativo invia il fileSIGALRM segnale alla tua applicazione. Per elaborare la scadenza del timer nella tua applicazione, dovresti anche definire una funzione di callback.

Ecco un esempio di una funzione di gestione del segnale:

Questo codice solleva aSIGALRMsegnale dopo1 secondo. Se vuoi aumentare il ritardo del timer a cinque secondi, chiama semplicementeallarme(5) Invece. Per fermare il timer, passare un valore pari a 0:allarme(0).

Allo scadere del tempo, il timer utilizzato non si riavvierà periodicamente. Ad esempio, se vuoi ritardare di un altro secondo, dovresti riavviare il meccanismo con un'altra chiamata aallarme().

Nonostante la sua facilità d’uso, questo metodo presenta alcuni svantaggi:

Salvare il codice di esempio fornito sopra comeallarme.c . Quando lo compili e lo esegui, il programma chiamerà il filetimer_callback funzione dopo un secondo. Aspetterà quindi i restanti due secondi a causa deldormire(3)linea, quindi terminare.

Il motivo per cui si utilizza il comando time è poter vedere gli orari. Ma se guardi il risultato, il tempo totale di esecuzione non è di tre secondi. Ciò è dovuto aSIGALRMsegnale daallarme(1)quando il primo secondo è scaduto, mentre ilchiamata di sistema causato dalla funzione sleep(3) è in esecuzione. Quando arriva questo segnale, interrompe la chiamata di sistema avviata perdormire (3).

Il meccanismo del timer a intervalli è stato disponibile per la prima volta nella versione 4.2 BSD. Successivamente è stato standardizzato da POSIX. I suoi principali vantaggi rispetto al tradizionaleallarme()metodo timer basato sono:

I prototipi di funzioni utilizzati per le operazioni del timer a intervalli sono i seguenti:

Se desideri impostare un timer a intervalli, dovrai utilizzare il fileitimerval struttura. Dovrai passare un valore utilizzando questa struttura come secondo argomento al filesettimerfunzione.

Ad esempio, un timer a intervallo che invierà una notifica all'applicazione per 1 secondo e poi ogni 300 millisecondi può essere impostato come segue:

Se è attivo un timer di intervallo prima dell'impostazione dei nuovi valori, i suoi valori vengono trasferiti all'indirizzo variabile delitimervaltipo assegnato al terzo parametro della funzione.

È possibile impostare tre diversi tipi di timer con il meccanismo del timer a intervalli. Specificare il tipo di timer nel primo parametro disettimer():

Tipo di timer

Segnale

Spiegazione

ITIMER_REAL

SIGALRM

Indipendente dal tempo impiegato dall'applicazione, calcolato sul tempo totale trascorso.

ITIMER_VIRTUALE

SIGVTALRM

Calcolato nel tempo in cui l'applicazione è in esecuzione solo in modalità utente.

ITIMER_PROF

SIGPROF

Calcolato sulla somma del tempo trascorso dall'applicazione sia in modalità utente che in modalità sistema.

Puoi vedere da questa tabella che ilITIMER_REALtipo invia aSIGALRMsegnale, proprio come ilallarme()funzione.

Utilizzando un timer a intervalli e