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
이 주어진 기간 동안 프로세스를 중단해야하지만 시스템에이를 중단하고 함수가 오류 코드를 반환하고errno
를EINTR
로 설정하도록 강제 할 수있는 이벤트가 있습니다. 이 경우 두 번째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
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