Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

시다바리

[C 언어] 시간 관련 관련함수 본문

Language/C

[C 언어] 시간 관련 관련함수

호서아빠 2008. 9. 23. 10:19

시간 관련 관련함수

1) sleep(), usleep(), nanosleep()  vs.  Sleep()
 

이들 함수는 모두 프로세스를 일정 시간 대기시키는 함수입니다. 함수명도 다르지만 함수의 사용법 또한 좀 다릅니다.
각각의 함수 원형은 다음과 같이 생겼습니다.
 
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
void usleep(unsigned long usec);
 
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
 
#include <winbase.h>
VOID Sleep(DWORD dwMilliseconds);
 
VC++에서 제공하는 Sleep()함수는 밀리초를 인자로 받아들이는 반면 GNU C계열에서 사용할 수 있는 sleep(), usleep(), nanosleep()함수는 인자로 각각 초단위, 마이크로초, 나노초의 시간을 받아 들입니다.
특히 nanosleep()함수의 경우는 timespec이라는 구조체인 req에 대기시간을 지정하여 넘겨야 하며 대기를 다하지 못한 시간 즉 남은 시간을 또 rem으로 받아야 합니다.
고로 다음과 같이 정의하여 사용하도록 합니다.
 
#if defined(WIN32) || defined(WIN64) #define sleep(x) Sleep((x)*1000) #else #include <time.h> #define Sleep(x) \ do{ \ struct timespec interval, remainder; \ interval.tv_sec = (unsigned int)((x)/1000); \ interval.tv_nsec = (((x)-(interval.tv_sec*1000))*1000000); \ nanosleep(&interval, &remainder); \ }while(0) #endif
 
 위의 정의로는 마이크로 초와 나노초 단위의 대기는 사용할 수 없지만 (VC++에서 밀리초 이상의 정밀도를 갖는 대기 시간의 함수를 제공하지 않아서...) 초단위 시간의 대기와 밀리초 단위 시간 대기의 함수는 sleep()과 Sleep()함수로 사용할 수 있을 것입니다.
 
 위에서 VC++이 아닌 경우에 Sleep()함수를 정의하면서 usleep()을 사용하지 않고 nanosleep()을 사용한 이유는 제가 usleep()의 인수에 1000을 곱해서 Sleep()함수 처럼 사용하다가 보니깐 usleep()의 인수 usec의 데이터형인 unsigned long에 지정할 수 있는 값이 생각보다 작더군요. 생각해 보면 usleep()에서 1초를 대기 시키기 위해서 1000000의 값을 입력해야 하는데 이러다 보면 unsigned long의 일반적인 한계인 4294967296 값으로 지정할 수 있는 최대 지연 시간은 4294.967296초, 약 72분 정도 밖에 안됩니다. 그래서 nanosleep()함수를 사용하였습니다. 이런 사정을 아셨다면 필요에 따라 usleep()으로 바꾸고 1000을 곱해서 사용하셔도 되겠습니다.

[출처] Sleep()과 gotoxy()
Comments