Utilice la función nanosleep en C

Jinku Hu 12 octubre 2023
  1. Utilice la función nanosleep para suspender la ejecución del programa con un temporizador de alta resolución en C
  2. Compruebe si la función nanosleep se ejecutó correctamente en C
Utilice la función nanosleep en C

Este artículo explicará varios métodos de cómo utilizar la función nanosleep en C.

Utilice la función nanosleep para suspender la ejecución del programa con un temporizador de alta resolución en C

nanosleep es una llamada al sistema compatible con POSIX para suspender la ejecución del programa durante un período de tiempo fijo determinado. Otras funciones también proporcionan las facilidades para hacer la misma operación, sleep es una de ellas, que tarda varios segundos en suspender el proceso de llamada. Se dice que sleep proporciona la suspensión de baja resolución. Por el contrario, nanosleep permite al usuario especificar el período de sueño con una precisión de nanosegundos.

La función nanosleep toma dos direcciones de objeto de tipo struct timespec, las cuales tienen dos miembros de datos: tv_sec - que representa el número de segundos y tv_nsec - que significa el número de nanosegundos. La primera estructura timespec se utiliza para especificar el período de tiempo de la suspensión. Tenga en cuenta que el valor de tv_nsec debe estar en el rango de 0 a 999999999; de lo contrario, la llamada fallará. En el siguiente ejemplo, ejecutamos un bucle con 10 iteraciones y suspendemos el proceso en el 5º bucle llamando al 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);
}

Producción :

Started loop..
Iteration - 0
Iteration - 1
Iteration - 2
Iteration - 3
Iteration - 4
Sleeping ....
Iteration - 5
Iteration - 6
Iteration - 7
Iteration - 8
Iteration - 9

Compruebe si la función nanosleep se ejecutó correctamente en C

Aunque nanosleep debería suspender el proceso durante el período determinado, hay eventos en el sistema que pueden interrumpirlo y obligar a la función a devolver el código de error y establecer errno en EINTR. En este caso, el segundo argumento timespec se usa para almacenar el período de tiempo restante cuando la llamada a la función fue interrumpida por la señal. Este objeto puede volver a llamar posteriormente nanosleep y, con suerte, terminar el sueño esta vez. El siguiente ejemplo demuestra cómo verificar múltiples códigos de error, imprimir los mensajes correspondientes y manejar la ejecución del código según sea necesario.

#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);
}

Producción :

Started loop..
Iteration - 0
Iteration - 1
Iteration - 2
Iteration - 3
Iteration - 4
Sleeping ....
Iteration - 5
Iteration - 6
Iteration - 7
Iteration - 8
Iteration - 9
Autor: 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