728x90



파일은 요아래에..

nano_sleep.c



#include <stdio.h>
#include <time.h>   /* Needed for struct timespec */


int nsleep(long miliseconds)
{
   struct timespec req, rem;

   if(miliseconds > 999)
   {   
        req.tv_sec = (int)(miliseconds / 1000);                            /* Must be Non-Negative */
        req.tv_nsec = (miliseconds - ((long)req.tv_sec * 1000)) * 1000000; /* Must be in range of 0 to 999999999 */
   }   
   else
   {   
        req.tv_sec = 0;                         /* Must be Non-Negative */
        req.tv_nsec = miliseconds * 1000000;    /* Must be in range of 0 to 999999999 */
   }   

   return nanosleep(&req , &rem);
}
 
int main(int argc, char **argv, char **arge) {
  struct timespec tps, tpe;
  //int ret = nsleep(1000);

	while(1){
 		if ((clock_gettime(CLOCK_REALTIME, &tps) != 0) || (clock_gettime(CLOCK_REALTIME, &tpe) != 0)) {
    	perror("clock_gettime");
    	return -1;
		}
	  //printf("sleep result %d\n",ret);
	  printf("[%lu.%lu] %lu ns\n", tps.tv_sec, tps.tv_nsec, tpe.tv_nsec-tps.tv_nsec);
  }
  return 0;
}


자 코드를 분석해보자. 사실상 clock_gettime 으로 접근가능한 실행시간 (Elapsed Time) 으로 접근하면 위의 스크린샷처럼 CPU에 의존성을 띄며 정확한 Nano Second 단위로 접근하여 Command 를 날리는 것이 불가능하다.


만약 핵융합과 핵분열 같이 정확한 타이밍을 필요로하는 문제가 있다면 어떻게 해야할까? 바로 고전시대의 라이브러리가 우리를 반겨준다. 다음 포스팅에서 살펴보자.




+ Recent posts