Use a função nanossono em C

Jinku Hu 12 outubro 2023
  1. Use a função nanosleep para suspender a execução do programa com o temporizador de alta resolução em C
  2. Verifique se a função nanosleep foi executada com sucesso em C
Use a função nanossono 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
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