본문 바로가기
리눅스

[리눅스 API] 시간

by 목가 2015. 8. 10.
반응형

실제 시간 : 어떤 표준 시점을 기준으로 측정되거나 프로세스 동작중 어떤 고정된 시점을 기준으로 측정된 시간

프로세스 시간 : 프로세스가 사용한 CPU 시간의 양


1.달력 시간
    - UTC(Universal Coordinated Time) : 예전에는 GMT 라고 했다. 1970년 1월 1일 새벽 0시를 말한다.


#include <sys/time.h>

int gettimeofday(struct timeval *tv, struct timezone *tz) : 성공하면 0을 리턴하고, 에러가 발생하면 -1을 리턴

 - 시스템의 현재 시간을 가져온다. tz 는 사용하지 않으므로 언제나 NULL로 전달한다.

int adjtime(struct timeval *delta, struct timeval *olddelta)성공하면 0을 리턴하고, 에러가 발생하면 -1을 리턴

 - 시스템 클록을 희망하는 값으로 점진적으로 조정한다. delta인자는 시간을 바꿀 초와 마이크로초 수를 지정하는 구조체이고, 양수인 경우 클락 시간이 점점 추가된다. 


#include <time.h>

time_t time(time_t *timep) : 기원 이래의 초 수를 리턴한다. 에러가 발생하면 -1을 리턴한다.

 - t = time(NULL) 로 주로 사용한다.

char *ctime(const time_t *timep) : 성공하면 줄바꿈 문자와 \0으로 끝나는 정적으로 할당된 문자열의 포인터를 리턴하고, 에러가 발생하면 NULL을 리턴한다.

 - Wed Jun 8 14:22:34 2011 와 같이 리턴된다.

struct tm *gmtime(const time_t *timep)성공하면 정적으로 할당된 문해된 시간 구조체의 포인터를 리턴하고, 에러가 발생하면 NULL 을 리턴한다.

 - 달력 시간을 UTC에 해당하는 분해된 시간으로 변환

struct tm *localtime(const time_t *timep) : gmttime 과 동일

 - 시간대와 DST 설정을 고려해서 시스템의 지역 시간에 해당하는 분해된 시간을 리턴한다.

char *asctime(const struct tm *timeptr)성공하면 줄바꿈 문자와 \0으로 끝나는 정적으로 할당된 문자열의 포인터를 리턴하고, 에러가 발생하면 NULL을 리턴한다.

 - tm에 분해된 시간 구조체의 포인터를 넘기면 ctime()과 동일한 형태의 시간을 담고 있는, 정적으로 할당된 문자열의 포인터를 리턴한다. 단, 지역 시간대 설정이 효과가 없다.
size_t strftime(char *outstr, size_t maxsize, const char *format, const struct tm *timeptr) : 성공하면 outstr에 저장된 바이트수를 리턴하고, 에러가 발생하면 0을 리턴한다.
 - 분해된 시간을 format 에 지정된 서식대로 만든다.

2. 시간대 
 /usr/share/zoneinfo : 시간대 정보가 저장되어있는 디렉토리
 /etc/localtime : 시스템의 지역 시간이 정의된 파일로 /usr/share/zoneinfo에 있는 파일 중 하나로의 링크일 수 있다.

 tzset() 함수 : TZ 환경 변수를 확인하고 변수가 설정되어 있지 않으면, 시간대는 /etc/localtime 파일에 정의되어 있는 기본 시간대로 초기화된다. 둘다 없으면 UTC가 사용된다.

아래와 같은 명령어로 시간대를 설정할 수 있다.
 TZ=":Pacific/Auckland"

3. 로케일
 /usr/share/locale : 로케일 정보가 들어있는 디렉토리
- 디렉토리 이름규칙 : 언어[_지역[.코드셋]][@변경자] 
언어는 ISO 언어 코드이고, 지역은 두글자로 이뤄진 ISO 국가 코드이다. 코드셋은 문자 인코딩 집합을 나타낸다. 변경자는 언어,지역,코드셋이 같은 여러 로케일 디렉토리를 구분하기 위한 것이다.

#inclue <locale.h>
cahr *setlocale(int category, const char *locale) : 성공하면 새로운 또는 현재의 로케일을 나타내는(보통 정적으로 할당된) 문자열의 포인터를 리턴하고, 에러가 발생하면 NULL을 리턴한다.
 - 로케일을 설정하는 방법은 locale 인자에 en_US 같이 시스템에 정의된 로케일 중 하나를 넣거나, 빈 문자열로 지정해서 로케일 설정을 환경 변수로부터 가져온다. setlocale(LC_ALL, "")

4. 프로세스시간

- 사용자 CPU 시간 : 사용자 모드에서 실행하면서 소비한 시간의 양이다. 가상 시간이라고도 하며, 프로그램이 CPU를 사용하고 있다고 생각하는 시간이다.

- 시스템 CPU 시간 : 커널 모드에서 실행하면서 소비한 시간의 양이다. 이는 커널이 시스템 호출을 실행하거나 프로그램 대신 다른 작업(예: 페이지 폴트처리)을 수행하면서 소비한 시간이다.

프로세스 시간을 프로세스가 소비한 전체 CPU 시간이라고도 한다.

#include <sys/time.h>

clock_t times(struct tms *buf) : 성공하면 과거의 '임의의' 시점 이래 클록 틱의 수(sysconf(_SC_CLK_TCK))를 리턴하고, 에러가 발생하면 -1을 리턴한다.

clock_t clock(void) : 호출 프로세스가 사용한 전체 CPU 시간을 CLOCKS_PER_SEC 단위로 측정해서 리턴한다. 에러가 발생하면 -1을 리턴한다.

- clock()이 리턴한 값을 CLOCKS_PER_SEC 단위로 측정된 것이므로, 프로세스가 사용한 CPU 시간을 초로 구하려면 이 값을 나눠야 한다. CLOCKS_PER_SEC 값은 백만으로 고정되어 있지만 장담할 수 없으므로 long 으로 캐스팅하는 것이 좋다.



반응형

댓글