Usa la funzione nanosleep in C
-
Utilizzare la funzione
nanosleep
per sospendere l’esecuzione del programma con il timer ad alta risoluzione in C -
Controlla se la funzione
nanosleep
è stata eseguita con successo in C
Questo articolo spiegherà diversi metodi su come utilizzare la funzione nanosleep
in C.
Utilizzare la funzione nanosleep
per sospendere l’esecuzione del programma con il timer ad alta risoluzione in C
nanosleep
è una chiamata di sistema conforme a POSIX per sospendere l’esecuzione del programma per un determinato periodo di tempo fisso. Altre funzioni forniscono anche le strutture per eseguire la stessa operazione, sleep
è una di queste, che impiega alcuni secondi per sospendere il processo di chiamata. Si dice che sleep
fornisca la sospensione a bassa risoluzione. Al contrario, nanosleep
consente all’utente di specificare il periodo di sonno con una precisione al nanosecondo.
La funzione nanosleep
accetta due indirizzi di tipo oggetto struct timespec
, entrambi hanno due membri di dati: tv_sec
- che rappresenta il numero di secondi e tv_nsec
- che significa il numero di nanosecondi. La prima struttura timespec
viene utilizzata per specificare il periodo di tempo della sospensione. Tieni presente che il valore di tv_nsec
deve essere compreso tra 0 e 999999999; in caso contrario, la chiamata fallirà. Nell’esempio seguente, eseguiamo un bucle con 10 iterazioni e sospendiamo il processo al 5° bucle chiamando il nanosleep
.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
enum { SECS_TO_SLEEP = 3, NSEC_TO_SLEEP = 125 };
int main() {
struct timespec remaining, request = {SECS_TO_SLEEP, NSEC_TO_SLEEP};
printf("Started loop..\n");
for (int i = 0; i < 10; ++i) {
printf("Iteration - %d\n", i);
if (i == 4) {
printf("Sleeping ....\n");
nanosleep(&request, &remaining);
}
}
exit(EXIT_SUCCESS);
}
Produzione:
Started loop..
Iteration - 0
Iteration - 1
Iteration - 2
Iteration - 3
Iteration - 4
Sleeping ....
Iteration - 5
Iteration - 6
Iteration - 7
Iteration - 8
Iteration - 9
Controlla se la funzione nanosleep
è stata eseguita con successo in C
Anche se nanosleep
dovrebbe sospendere il processo per un dato periodo, ci sono eventi nel sistema che possono interromperlo e forzare la funzione a restituire il codice di errore e impostare errno
su EINTR
. In questo caso, il secondo argomento timespec
viene utilizzato per memorizzare il periodo di tempo rimanente in cui la chiamata alla funzione è stata interrotta dal segnale. Questo oggetto può successivamente chiamare di nuovo nanosleep
e, si spera, terminare il sonno questa volta. L’esempio successivo mostra come verificare la presenza di più codici di errore, stampare i messaggi corrispondenti e gestire l’esecuzione del codice secondo necessità.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
enum { SECS_TO_SLEEP = 3, NSEC_TO_SLEEP = 125 };
int main() {
struct timespec remaining, request = {SECS_TO_SLEEP, NSEC_TO_SLEEP};
printf("Started loop..\n");
for (int i = 0; i < 10; ++i) {
printf("Iteration - %d\n", i);
if (i == 4) {
printf("Sleeping ....\n");
errno = 0;
if (nanosleep(&request, &remaining) == -1) {
switch (errno) {
case EINTR:
printf("interrupted by a signal handler\n");
exit(EXIT_FAILURE);
case EINVAL:
printf("tv_nsec - not in range or tv_sec is negative\n");
exit(EXIT_FAILURE);
default:
perror("nanosleep");
exit(EXIT_FAILURE);
}
}
}
}
exit(EXIT_SUCCESS);
}
Produzione:
Started loop..
Iteration - 0
Iteration - 1
Iteration - 2
Iteration - 3
Iteration - 4
Sleeping ....
Iteration - 5
Iteration - 6
Iteration - 7
Iteration - 8
Iteration - 9
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook