Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- HTML
- Linux
- TensorflowServer
- html태그정리
- 웹페이지 기본
- 삼성sw역량테스트b형
- ubuntu18.04
- html input
- C언어
- 멀티캐스트
- HTML예제
- raspberrypi
- tensorflow
- 다항회귀
- RAID구축
- RAID개념설명
- jupyter
- multicast
- 다항회귀예제
- 개념설명
- 라즈베리파이
- 삼성SW역량테스트
- html input tag
- RIAD0
- Raid
- Ubunrtu
- html환경구축
- docker
- CSS
- 코딩테스트후기
Archives
- Today
- Total
Easy ways
[Linux / C 언어] 시스템 시간 변경하기(OS 시간 수정) 본문
반응형
어떤 기계의 전원을 오랫동안 꺼두었다가 나중에 다시 연결했을 때
기계의 시간이 틀어지는 경우가 있죠
이건 왜 그러는 걸까요?
우리가 쓰는 보드들은 보통 RTC(Real Time Clock)이라는 칩을 가지고 있습니다.
이 칩이 1초를 계산해주어 보드에 세팅된 시간을 통해 시간이 흘러가는 것을 표시해 줍니다.
RTC는 거의 모든 기계에 포함되어있고 보통 배터리를 따로 씁니다.
시간이 틀어지는 것은 이 배터리가 다돼서 RTC가 정상작동을 안 해서 그렇습니다.
아마 누구나 한 번쯤은 경험해 보신 적 있으실 겁니다.
프로그램을 하다 보면 시간에 영향을 받는 경우가 많은데
이렇게 시간이 틀어져있다면 시간을 다시 설정해 주어야 합니다.
그래서 오늘은 리눅스 OS의 시간을 코드에서 수정하는 법을 알아보겠습니다.
핵심 함수
void SetTime(struct tm *set_time_tm)
{
time_t set_time_sec;
set_time_sec = mktime(set_time_tm);
stime(&set_time_sec);
// Set hwclock in Linux System
system("hwclock -w");
}
핵심 함수는 위와 같습니다.
void SetTime(struct tm *set_time_tm)
시간 구조체를 입력으로 받아
time_t set_time_sec;
set_time_sec = mktime(set_time_tm);
그것을 시간 초로 변경한 후
[Example) 21년 3월 1일 12시 -> 135481321 초 이런식으로]
stime(&set_time_sec);
시스템 시간에 설정해주고
system("hwclock -w");
이를 시스템에 반영합니다.
예제 코드
예제 코드는 시간을 입력받아서
시간의 유효성을 확인한 후 시스템에 반영하는 코드입니다.
#include <stdio.h>
#include <stdlib.h> /* atoi */
#include <time.h>
#define SUCCESS 1
#define FAIL -1
//-----------------------------------------------------------------------------
//=============================================================================
void SetTime(struct tm *set_time_tm)
{
time_t set_time_sec;
set_time_sec = mktime(set_time_tm);
stime(&set_time_sec);
// Set hwclock in Linux System
system("hwclock -w");
}
//-----------------------------------------------------------------------------
//=============================================================================
int CheckDate(int year, int month, int day)
{
// check month
if(month <=0 || month >12) return FAIL;
// check February
if(month == 2)
{
if ((year%4==0 && year%100!=0) || year%400==0)
{if ( 0<=day || day>29) return FAIL; }
else
{if ( day<=0 || day>28) return FAIL; }
}
// check odd month
else if (month%2 == 1 )
{
if( month <= 7)
{if ( day <= 0 || day > 31) return FAIL;}
else
{if ( day <= 0 || day > 30) return FAIL;}
}
// check even month
else
{
if( month <= 6)
{if ( day<=0 || day>30) return FAIL;}
else
{if ( day<=0 || day>31) return FAIL;}
}
return SUCCESS;
}
//-----------------------------------------------------------------------------
//=============================================================================
int CheckTime(int hour, int min, int sec)
{
// check hour
if(hour <=0 || hour >24) return FAIL;
// check min
if(min <=0 || min >60) return FAIL;
// check sec
if(sec <=0 || sec >60) return FAIL;
return SUCCESS;
}
//-----------------------------------------------------------------------------
//=============================================================================
void Err_print(void)
{
printf("ERROR!! Wrong Configuration..!\n");
printf("Example) # ./setTime 2021 03 16 11 36 01\n");
}
//-----------------------------------------------------------------------------
//=============================================================================
int main(int argc,char *argv[] )
{
struct tm set_time_tm;
int year,month,day,hour,min,sec;
//Check the number of input data
if(argc != 7)
{
Err_print();
return FAIL;
}
// convert string data to integer
year = atoi(argv[1]);
month = atoi(argv[2]);
day = atoi(argv[3]);
hour = atoi(argv[4]);
min = atoi(argv[5]);
sec = atoi(argv[6]);
printf("------------------Set Time------------------------\n");
printf("year=%d, month=%d, day=%d, hour=%d, min=%d, sec=%d\n"
,year,month,day,hour,min,sec);
// Check Date and Time
if(CheckDate(year, month, day)==FAIL || CheckTime(hour, min, sec)==FAIL)
{
Err_print();
return FAIL;
}
set_time_tm.tm_year = year-1900;
set_time_tm.tm_mon = month-1;
set_time_tm.tm_mday = day;
set_time_tm.tm_hour = hour;
set_time_tm.tm_min = min;
set_time_tm.tm_sec = sec;
SetTime(&set_time_tm);
return SUCCESS;
}
예제 코드 실행결과는 다음과 같습니다.
여기서 date 명령은 리눅스의 시스템 시간을 알려주는 명령어입니다.
반응형
'프로그램 개발 > Linux' 카테고리의 다른 글
[Linux] Window 10에서 Linux 사용하기 (WSL) (0) | 2021.03.07 |
---|
Comments