Usa la funzione nanosleep in C

Jinku Hu 12 ottobre 2023
  1. Utilizzare la funzione nanosleep per sospendere l’esecuzione del programma con il timer ad alta risoluzione in C
  2. Controlla se la funzione nanosleep è stata eseguita con successo in C
Usa la funzione nanosleep 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
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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