nanosleep() - 프로세스/쓰레드의 실행을 멈추는(재우는) 함수

반응형

nanosleep()은 특정 시간 동안 프로세스/쓰레드를 재우는데(동작을 멈추는데) 사용된다.

 

개인적으로는 지금까지 마이크로초 단위의 함수인 usleep()을 많이 사용했는데(sleep() 함수가  초단위라서 너무 긴 경우에), 이번 기회에 nanosleep()으로 변경하게 되었다.

 

찾아보니, usleep() 대신 nanosleep()을 쓰는게 좋은 듯 하고 특히 nanosleep()은 POSIX 함수라고 한다.

 

인자로 단순히 마이크로초 단위의 시간값을 전달해 주는 usleep() 함수에 비해 nanosleep() 함수의 사용법이 아주 조금 더 복잡하긴 하지만, 사용하기 어려운 수준은 아닌 듯 하다.

 

nanosleep()의 함수 원형은 다음과 같다.

#include <time.h>

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

 

req 인자에 잠들고 싶은 시간을 넣고 rem 인자는 비운 상태로 함수를 호출하면, req에 지정한 시간만큼 지난 후에 함수가 리턴된다. 함수가 리턴되기 전까지 프로세스/쓰레드가 잠들어 있는 셈이다.

 

만약 잠들어 있는 중간에 인터럽트 등으로 인해 함수가 리턴되면, rem 인자에 남은 시간(req에 지정한 시간 - 현재까지 잠들었던 시간)이 반환된다고 한다. 그럼 그 남은 시간(rem)을 req 인자로 전달하는 nanosleep() 함수를 다시 호출함으로써 원래 목표했던 시간만큼을 멈출 수 있다고 한다.

 

timespec 구조체는 tv_sec 변수와 tv_nsec 변수로 구성되어 있으므로, 원하는 시간값을 초 단위 수와 나노초 단위 수로 나누어 req 인자에 지정하면 된다.

 

다음은 nanosleep() 함수를 이용하여 1.234567891 초만큼 잠드는 간단한 예이다.

struct timespec req, rem;
req.tv_sec = 1;
req.tv_nsec = 234567891;

nanosleep(&req, &rem);

 

댓글

Designed by JB FACTORY