ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] Time #date, hwclock, gettimeofday, time, localtime, clock
    프로그래밍/컴퓨터 네트워크 2024. 4. 5. 03:43

     

    Linux 에서관리하는시간 확인하기

     

    1. $ date

    Mon Apr 11 16:30:00 UTC 2024

    • 부팅 시에 RTC( Real Time Clock , H/W장치, 전원이 없어도 시간 추)정보를 받고, 그 뒤엔 리눅스에서 시간 정보를 관리
    • 네트워크에 연결될 때, Time 서버에서 시간을 자동 update 한다.
    • 현재 요일(Mon: 월요일), 월(Mon), 일(11), 시간(16:30:00), 시간대(UTC), 연도(2024) 등의 정보가 포함
    • 컴퓨터 시스템의 현재 시간을 의미

     

    2. $sudo hwclock

    2024-04-11 16:30:00.000000+00:00

    • RTC HW 장치가 가지고 있는 시간 정보 값을 실시간으로 가져옴
    • 연도(2024), 월(04), 일(11), 시간(16:30:00), 및 시간대(+00:00) 등의 정보가 포함
    • 운영체제에서 관리, CPU가 실행하는 명령어의 실행 주기를 결정함

     

    💡 인터넷 타임서버에서 시간 가져오기

    - 1. rdate 설치 필요 : $sudo apt install rdate -y

    - 2. $sudo rdate [인터넷 타임서버 주소]  ex) $sudo rdate time.bora.net

     

    • 리눅스에서는 date와 RTC가 맞지 않으면 한쪽으로 Sync를 맞춰주는 명령어를 써야한다.
      • 시스템 시간(date)을 기준 → RTC(hwclock) 시간을 변경 : $sudo hwclock –s
      • RTC 시간을 기준 → 시스템 시간을 변경 : $hwclock –w

     


    c언어에서 time 다루기

     

     

    1. time system call을 이용한 date출력

    time_t time(time_t *tloc);

    • 1970년 1월 1일 0시 0초(epoch) 부터 현재까지의 시간초 단위 로 반환
    • NULL 사용 가능, NULL 이 아닐 경우, 해당 메모리 주소에 저장되어 계속 접근 가능
    • 반환값 : time_t type
      • 64 비트 unsigned 정수형 숫자
      • 시간 표현 data type

    #include <stdio.h>
    #include <time.h>
    int main(){
    
    	time_t time1 = time(NULL);
        //인자로 NULL을 넘겨주는 경우 어떤 변수에 값을 저장할지를 지정하지 않는다.
        //하지만, 함수는 시간 정보를 반환하기 때문에 함수가 반환한 값을 변수에 직접 저장할 수 있다.
    	printf("time1 : %ld\n", time1);
    	
    	time_t time2;
    	time_t time3;
    	time3 = time(&time2);
        //인자로 반환값을 저장할 주소를 넘겨주었기 때문에,
        //해당 함수는 반환값을 time2변수에 저장해줌
        
    	printf("time2 : %ld\n", time2);
    	printf("time3 : %ld\n", time3);
    
    	return 0;
    }

     


     

    2. time(), 구조체 tm,  localtime() 을 이용해 시간 정보를 좀 더 보기 좋게 얻기

    #include <stdio.h>
    #include <time.h>
     
    int main(){
      time_t t = time(0);
      struct tm *tmm = localtime(&t);
     
      printf("Year : %d\n", tmm->tm_year);	 
      printf("Month : %d\n", tmm->tm_mon);
      printf("Day : %d\n", tmm->tm_mday);
      printf("Day of the week : %d\n", tmm->tm_wday);
      printf("Hour : %d\n", tmm->tm_hour);
      printf("Min : %d\n", tmm->tm_min);
      printf("Sec : %d\n", tmm->tm_sec);
         
      return 0;
    }

     

     

    • 구조체 tm

    • int tm_sec: 초 (0-59)
    • int tm_min: 분 (0-59)
    • int tm_hour: 시 (0-23)
    • int tm_mday: 월의 날짜 (1-31)
    • int tm_mon: 월 (0-11, 0이 1월을 나타냄)
    • int tm_year: 연도 - 1900 (예: 2024년은 124를 나타냄)
    • int tm_wday: 주의 요일 (0-6, 0이 일요일을 나타냄)
    • int tm_yday: 연 중 날짜 (0-365, 1월 1일부터의 일 수)
    • int tm_isdst: 서머타임 여부 (1: 적용, 0: 적용 안 됨, -1: 정보 없음)

     

    • localtime() 

    struct tm *localtime(const time_t *timeval);

    • 기능 : 입력된 시간 간격을 기반으로 날짜를 계산하여 tm 구조체에 맞게 반환해줌
    • 입력값 : 1970년 1월 1일 0시 0초로 부터의 시간 간격(초)이 저장된 변수의 주소
    • 반환값 : struct tm 구조체 포인터
    • 라이브러리 : <time.h>

     


     

    3. gettimeofday()를 이용해 초와 마이크로 초 까지의 상세한 데이터 얻기

    #include <stdio.h>
    #include <sys/time.h>
    
    int main(){
    	struct timeval time;
    
    	gettimeofday(&time, NULL);
    
    	printf("sec : %ld\n", time.tv_sec);
    	printf("usec : %ld\n", time.tv_usec);
    	return 0;
    }

     

    • struct timeval
    struct timeval
    {
        long tv_sec;       // 초
        long tv_usec;      // 마이크로초
    }

     

     

    • gettimeofday() system call

    int gettimeofday(struct timeval *tv, struct timezone *tz);

    • 기능 : 시스템의 현재 시간을 마이크로 초 단위까지 정밀하게 가져오기 위한 시스템 콜
    • 입력값
      • struct timeval 구조체 : 시간 정보가 저장된다.
      • struct timezone 구조체 : timezone 설정용 구조체, 이제 사용 안 함 => NULL전달
    • 반환값 : 970년 1월 1일 0시 0초(epoch) 부터 현재까지의 시간 초 단위 + 마이크로 초단위로 반환
    • 라이브러리 : #include <sys/time.h> 필요

     

     


    4. clock() 함수를 이용해 프로세스 실행시간 CPU 클럭틱값 구하기

    #include <stdio.h>
    #include <time.h>
    
    int main(){
    
    	clock_t a = clock();
    	printf("%ld, %ld\n", a, CLOCKS_PER_SEC );	
    
    	return 0;
    }

     

    • clock()

    clock_t clock(void);

    • 현재 프로세스가 시작되고, 얼마나 시간이 흘렀는지 CPU 클럭 틱 값( clock_t type )을 반환
    • 실행할 때마다 다르게 나올 수 있다.

     

    💡이때, CLOCK_PER_SEC은 1초당 시스템 clock이 올라가는 정도를 나타내는데, 

    CLOCK_PER_SEC = 1000000(백만) 이라는 것은, 1초에 100만 클럭 == 1클럭당 1us초 임을 의미한다.

    이때, 현재 프로세스가 시작되고, 얼마나 시간이 흘렀는지 초 단위로 알고 싶다면, clock()의 반환값을 CLOCK_PER_SEC로 나누면 된다!

     

    • clock()을 이용해 코드의 실행시간 구하기
      • 다음에서 출력된 time은 초(s) 단위이다!

    #include <stdio.h>
    #include <time.h>
    
    int main(){
        clock_t start,end;
        int sum = 1;
      
        start = clock();
        for(int i=0; i<100000000; i++){
            sum = sum + 2;
        }
        end = clock();
    
        printf("[time : %lfs]\n", (float)(end-start)/CLOCKS_PER_SEC);
        return 0;
    }
Designed by Tistory.
-->