C에서 nanosleep 기능 사용

Jinku Hu 2023년10월12일
  1. nanosleep기능을 사용하여 C에서 고해상도 타이머로 프로그램 실행을 일시 중지합니다
  2. C에서nanosleep기능이 성공적으로 실행되었는지 확인
C에서 nanosleep 기능 사용

이 기사에서는 C에서nanosleep기능을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

nanosleep기능을 사용하여 C에서 고해상도 타이머로 프로그램 실행을 일시 중지합니다

nanosleep은 주어진 고정 시간 동안 프로그램 실행을 일시 중단하기위한 POSIX 호환 시스템 호출입니다. 다른 함수도 동일한 작업을 수행 할 수있는 기능을 제공합니다. sleep은 그중 하나이며 호출 프로세스를 일시 중단하는 데 몇 초가 걸립니다. sleep은 저해상도 서스펜션을 제공한다고합니다. 반면 nanosleep은 사용자가 나노초 정밀도로 절전 기간을 지정할 수 있도록합니다.

nanosleep함수는struct timespec객체 유형의 두 주소를 취합니다. 둘 다 두 개의 데이터 멤버를가집니다.tv_sec-초 수를 나타내고tv_nsec-나노초 수를 나타냅니다. 첫 번째timespec구조는 정지 기간을 지정하는 데 사용됩니다. tv_nsec값은 0-999999999 범위에 있어야합니다. 그렇지 않으면 호출이 실패합니다. 다음 예에서는 10 회 반복으로 루프를 실행하고nanosleep을 호출하여 5 번째주기에 프로세스를 일시 중단합니다.

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

출력:

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

C에서nanosleep기능이 성공적으로 실행되었는지 확인

nanosleep이 주어진 기간 동안 프로세스를 중단해야하지만 시스템에이를 중단하고 함수가 오류 코드를 반환하고errnoEINTR로 설정하도록 강제 할 수있는 이벤트가 있습니다. 이 경우 두 번째timespec인수는 함수 호출이 신호에 의해 중단되었을 때 남은 기간을 저장하는 데 사용됩니다. 이 객체는 나중에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");

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

출력:

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