NANOSLEEP(2)

이름
nanosleep - 지정한 시간에 실행을 잠시 멈춘다.

사용법
#include <time.h>

int nanosleep(const struct timespec *req, struct timespec *rem);

설명
nanosleep 은 적어도 *req 에 지정된 시간만큼 프로그램 실행을 늦춘다. 시그널이 프로세스로 전달됐다면 그런 기능은 더 빨리 반환할 수 있다. 그 기능은 시그널이 프로세스에 전달되었다면 더 빨리 반환할 수 있다. -1이 반환되는 경우 EINTR 로 errno를 설정하고, rem 이 NULL 이 아니라면 rem 이 가리키는 곳에 남은 시간을 기록한다. 그후 *rem 값은 다시 nanosleep 오출에 사용될 수 있다. timespec 은 나노초의 정밀도를 가진 시간 간격을 지정하는데 사용된다. 그것은 <time.h> 에 지정되고

    struct timespec
    {
    	time_t	tv_sec;			/* seconds */
    	long	tv_nsec;		/* nanoseconds */
    };

의 형태를 갖는다. 나노초필드 값은 에서 999 999 999의 범위안에 들어야 한다. sleep(3) 와 usleep(3) 를 비교한다면, nanosleep 는 모든 POSIX 표준인 시그널에 영향을 주지 않는 잇점이 있다. 그것은 높은 시간 분석을 제공하고, 더 쉽게 시그널에 의해 중단된 계속적인 대기상태를 허락한다.

에러
에러나 예외(exception)의 경우, nanosleep 시스템 호출은 0대신 -1을 반환하고 다음 값중 하나로 errno 를 설정한다:

EINTR
    일시 중지는 프로세스에 전달된 비블록화 시그널에 의해 중단된다. 남은 대기 시간은 프로세스가 쉽게 nanosleep 를 다시 호출할 수 있도록 *rem에 기록되고, 일시정지는 계속된다.

EINVAL
    tv_nsec 필드안의 값은 0에서 999 999 999범위가 아니거나 tv_sec 가 음수이다.

버그
nanosleep 의 현재 구현은 1/HZ s (i.e, 10 ms on Linux/i386 and 1 ms on Linux/Alpha) 의 resolution을 가지고 있는 표준의 커널 타이머 메카니즘을 기본으로한다. 그러므로, nanosleep 는 적어도 지정된 시간만큼 항상 일시 정지한다. 그러나 그것은 프로세스가 다시 실행가능 해지기까지 지정된것 보다 10ms이상 더 걸릴 수 있다. 같은 이유로, *rem에 전달된 시그 널의 반환값은 대개 1/HZ s정도 된다. 더욱더 정확한 일시정지가 필요한 응용프로그램처럼 nanosleep 도 또한 매우정확한 일시정지가 가능하다. 프로세스가 SCHED_FIFO 나 SCHED_RR 와 같은 실제시간정책에서 스케쥴링되었다면, 2ms이상의 일시정지는 마이크로초의 정밀도를 가진다.

호환
POSIX.1b (formerly POSIX.4).

관련 항목
sleep(3), usleep(3), sched_setscheduler(2), timer_create(2)

역자
ASPLINUX<man@asp-linux.co.kr>, 2000년 7월 29