Utilice 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 -
Compruebe si la función
nanosleep
se ejecutó correctamente 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
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