-
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; }
'프로그래밍 > 컴퓨터 네트워크' 카테고리의 다른 글
[리눅스 네트워크] - 2 : 채팅 서버 만들기 (feat. multi thread) (0) 2024.04.05 [리눅스 네트워크] - 1 : echo 서버 만들기 (0) 2024.04.05