Use a função nanossono em C
-
Use a função
nanosleep
para suspender a execução do programa com o temporizador de alta resolução em C -
Verifique se a função
nanosleep
foi executada com sucesso em C
Este artigo irá explicar vários métodos de como usar a função nanosleep
em C.
Use a função nanosleep
para suspender a execução do programa com o temporizador de alta resolução em C
nanosleep
é uma chamada de sistema compatível com POSIX para suspender a execução do programa por um determinado período de tempo fixo. Outras funções também fornecem as facilidades para fazer a mesma operação, sleep
é uma delas, que leva alguns segundos para suspender o processo de chamada. sleep
é dito para fornecer a suspensão de baixa resolução. Em contraste, nanosleep
permite ao usuário especificar o período de sono com precisão de nanossegundos.
A função nanosleep
leva dois endereços do objeto do tipo struct timespec
, ambos com dois membros de dados: tv_sec
- representando o número de segundos e tv_nsec
- significando o número de nanossegundos. A primeira estrutura timespec
é usada para especificar o período de tempo da suspensão. Lembre-se de que o valor tv_nsec
deve estar no intervalo de 0 a 999999999; caso contrário, a chamada falhará. No exemplo a seguir, executamos um loop com 10 iterações e suspendemos o processo no 5º bucle chamando o 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);
}
Resultado:
Started loop..
Iteration - 0
Iteration - 1
Iteration - 2
Iteration - 3
Iteration - 4
Sleeping ....
Iteration - 5
Iteration - 6
Iteration - 7
Iteration - 8
Iteration - 9
Verifique se a função nanosleep
foi executada com sucesso em C
Mesmo que nanosleep
deva suspender o processo por um determinado período, existem eventos no sistema que podem interrompê-lo e forçar a função a retornar o código de erro e definir errno
para EINTR
. Neste caso, o segundo argumento timespec
é usado para armazenar o período de tempo restante quando a chamada da função foi interrompida pelo sinal. Este objeto pode posteriormente chamar de nanosleep
novamente e, com sorte, terminar o sono desta vez. O próximo exemplo demonstra como verificar vários códigos de erro, imprimir as mensagens correspondentes e lidar com a execução do código conforme necessário.
#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);
}
Resultado:
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