'System Program/time'에 해당되는 글 3건

  1. 2014.02.24 3. Timer and Alarm
  2. 2014.02.21 1. time_t 시간
  3. 2014.02.21 2. 시간의 개념

3. Timer and Alarm

System Program/time 2014. 2. 24. 08:35

1. 개념

 

Timer 및 Alarm은 특정 시간에 Process에게 어떤 Job을 수행하도록 Schedule을 한다.

여기서는 전통적인 시스템 콜 함수에 대해서 알아본다.

 

2. Timer Interfaces

 

#include <sys/time.h>

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 

 

1) which 설정 가능 값

    - ITIMER_REAL : 실제 시간 (벽시계 개념)

    - ITIMER_VIRTUAL

    - ITIMER_PROF

2) struct itimerval 구조체

{

struct timeval it_interval;

struct timeval it_value;

}

               성공하면 '0'을 리턴, 에러가 발생하면 '-1'을 리턴  

 

2.1. 일회성 Timer 설정법

 

new_value에서 struct timeval it_interval 값이 '0'으로 설정

 

2.2. 주기적 Timer 설정

 

new_value에서 struct timeval it_interval 값에 어떤 주기로 반복할 것인지에 대한 초 값을 적어준다.

 

new_value에서 struct it_value는 timer에 대한 expire되어야 할 시간값을 설정한다.

 

2.3. 일회성 Timer 설정에 대한 다른 방법

 

아래와 같이 간단한 함수를 사용하면 위의 setitmer를 흉내낼 수 있다. 일회성 Timer인 경우는 이것이 더 쉽다.

 

#include <unistd.h>

unsigned int alarm(unsigned int seconds); 

항상 성공, 이전에 남은 시간값을 리턴   

 

3. 예제

 

/*
* main.c -- C Test App.
*
* Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include <time.h>

static void signal_handler(int sig)
{
	printf("%s : signal received \n", strsignal(sig));
	
}

int main(int argc, char *argv[])
{
	int retval = -1;
	struct sigaction sa;
	struct itimerval itv = {0};
	struct itimerval curitv = {0};
	
	itv.it_interval.tv_sec = 2;
	itv.it_value.tv_sec = 2;
	
	sigemptyset(&sa.sa_mask);
	sa.sa_handler = signal_handler;
	//sa.sa_flags = SA_RESETHAND;
	if(sigaction(SIGALRM, &sa, NULL) == -1)
		perror("sigaction");
	
 	printf("START Timer \n");
	
	setitimer(ITIMER_REAL, &itv, NULL);
	//alarm(2);
	while(1)
	{	
		if(getitimer(ITIMER_REAL, &curitv) == -1)
		{
			perror("getitimer");
			break;
		}
		printf("Remained secs : %ld\n", curitv.it_value.tv_sec);
		sleep(1);
	}
	
	printf("End Timer \n");
	return 0;
}


위 예제에서 Timer가 설정값에 도달하여 Event가 발생하면 기본 동작은 프로세서 종료이다.

위의 예제는 시그널 핸들러를 설치하여 시그널을 가로챘으며 SA_RESETHAND(SA_ONESHOT)를 설정하면

주기적 Timer에서 두 번째 시그널에 대해서 기본값으로 동작하여 프로세서가 종료한다.

 

같이 동작이지만 주석처린된 alarm(2)함수를 사용하면 동작은 같다.

 

위의 예제에서 itv.it_interval.tv_sec = 2로 설정하는 부분이 없으면 일회성 Timer로 동작한다.

 

4. 결론

 

일반적으로 Timer의 구현은 어떤 식으로 할 것인가?

위의 함수를 사용할까?

Timer를 처리하는 task를 통해서 모든 처리를 수행하고 Queu에 넣어서 관리 추적하는 기법도 있을 수 있다.

 

 

'System Program > time' 카테고리의 다른 글

1. time_t 시간  (0) 2014.02.21
2. 시간의 개념  (0) 2014.02.21
:

1. time_t 시간

System Program/time 2014. 2. 21. 15:31

1. 리눅스 시간

 

리눅스는 초기 기원값에서 얼마만큼 시간이 흘렀는지를 나타내는 지표로 시간을 관리한다.

여기서 초기 기원값은 1970년 1월 1일 0시를 말한다.

 

이 시간은 time_t라는 데이터형을 통해서 얻거나 관리할 수 있다.

 

리눅스에서는 time_t를 얻기위해서 아래와 같은 시스템 호출 함수를 지원한다.

 

1.1. time() 시스템 함수

 

#include <time.h>

time_t time(time_t *timep); 

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

 

time()함수는 time_t를 두 군데에서 리턴하므로 에러 확인은 유효하지 않는 저장소를 참조할 때 발생할 수 있는 errno에

대한 EFAULT값만 확인한다.   

 

1.2. gettimeofday() 시스템 함수

 

#include <sys/time.h>

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

 

1) 

struct timeval {

time_t           tv_sec;                                     /* UTC 1970-1-1, 0시 이래의 초 */

suseconds_t tv_usec;                                   /* 추가적인 마이크로 초(long int) */

} ;

2)

struct timezone *tz = NULL 로 할당하면 된다.

                                                                                          성공하면 '0'을 리턴, 에러가 발생하면 '-1'을 리턴  

 

1.3. ctime() 함수

 

사용자가 읽기 편한 구조로 변환하는 함수이다.

 

#include <time.h>

char *ctime(const time_t *timep); 

                                              성공하면 '\0'으로 끝나는 정적 문자열 리턴, 에러가 발생하면 NULL을 리턴  

 

2. 위의 함수 사용 예시

 

*
* main.c -- C Test App.
*
* Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include <time.h>

int main(int argc, char *argv[])
{
	struct timeval tv;
	time_t t;
	
	if(gettimeofday(&tv, NULL) == -1)
		perror("gettimeofday\n");
	
	printf("gettimeofday = %ld, %ld\n", tv.tv_sec, tv.tv_usec);
	
	t = time(NULL);
	if(errno == EFAULT)
		perror("time\n");
	
	printf("time = %ld\n", t);	
	
	printf("current time : %s", ctime(&t));
	printf("current time : %s", ctime(&tv.tv_sec));
	
	return 0;
}


3. 결론

 

여기서는 time_t 가 무엇이고, 이를 얻기 위해서 사용되는 함수들을 소개하고 사용법에 대해서 고찰해 보았다.

 

 

'System Program > time' 카테고리의 다른 글

3. Timer and Alarm  (0) 2014.02.24
2. 시간의 개념  (0) 2014.02.21
:

2. 시간의 개념

System Program/time 2014. 2. 21. 15:23

1. 시간에 대해 더 고려해야할 사항

 

1장에서 time_t로 기원시간으로부터 현재까지 elapse된 초를 얻었다.

그리고 ctime()함수를 통해서 일반적인 달력 시간 표현으로 시간을 단순히 표시하였다.

 

하지만 실제 개발과정에서는 SDK로 구현된 App.과 Embedded 시스템간의 시간을 맞추는 것이 정확한

개념이 없으면 문제를 많이 일으킨다.  

UTC시간과 로컬 시간이라는 개념에 대해서 정확히 이해할 필요가 있다.

여기서는 단순한 달력 시간 표시에서 한발 더 나아가 위의 두 시간의 개념과 관련 시스템 함수에 대해서 알아본다.

 

2. UTC 시간

 

영국 그리니치 표준이다. 다른 말로는 "GMT+0"시간으로 어디 어느 나라에서도 동일한 시간이다.

 

3. 로컬 시간

 

로컬 시간은 현재 시스템이 존재하는 곳의 시간을 의미한다.

 

전 세계의 시간을 통일된 체계로 관리하기 위해서 영국 그리니치 천문대를 기준으로 zone을 나눈다.

이것을 timezone이라고 한다. timezone은 아래 URL을 참고하기 바람.  

 

예로 한국은 그리니치 천문대를 기준으로 동쪽 방향으로 9번째 Timezone에 위치한다.

따라서 다른 표기로는 "GMT+9"에 해당된다.  

 

[참조] http://www.timeanddate.com/time/map/ 

 

4. GMT 및 Local Time System Call 함수

 

#include <time.h>

 

struct tm *gmtime(const time_t *timep);

struct tm *localtime(const time_t *timep);

                           성공하면 "\n"과 '\0'으로 끝나는 정적으로 할당된 문자열의 포인터를 리턴, 에러면 NULL을 리턴

 

여기서 struct tm이라는 새로운 구조체가 등장한다. 시간을 표현하는 다른 구조체이다.

 

4.1. struct tm 시간을 time_t로 변환하는 함수

 

#include <time.h>

 time_t mktime(struct tm *timeptr);

                                                                                               에러가 발생하면 (time_t) '-1'을 리턴, 성공하면 초

 

4.2. struct tm을 문자열로 변환하는 함수

 

#include <time.h>

 char *asctime(const struct tm *timeptr);

                           성공하면 "\n"과 '\0'으로 끝나는 정적으로 할당된 문자열의 포인터를 리턴, 에러면 NULL을 리턴

 

 

5. 예제

 

/*
* main.c -- C Test App.
*
* Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include <time.h>

int main(int argc, char *argv[])
{
	struct tm *t;
	time_t tt;
	
	tt = time(NULL);
	if(errno == EFAULT)
		perror("time\n");

	// GMT Time
	t = gmtime(&tt);	
	printf("gmt time   : %s", asctime(t));
	
	// Local Time
	t = localtime(&tt);
	printf("local time : %s", asctime(t));
	
	return 0;
}


 

6. 정리

 

시간 처리 함수가 너무 많아서 정말 혼동스럽다. 하지만 다음과 같이 정리하면 되지 않을까 한다.

 

리눅스의 시간은 1970년 1월 1일 0시를 기준으로 현재까지 지난 초수를 기반으로 하기 때문에 time_t가 기준이다.

 

결국 이 초수는 달력 시간으로 표시하여 일반적으로 통용되는 시간으로 변환하기 위해서 사용하는 함수가 존재한다.

 

또한 필요에 따라서 표준시간이나 로컬 시간을 출력할 필요가 있고 이 때는 struct tm이라는 구조체를 사용하므로

 

기존 time_t와 이들 간에 변환을 위한 함수들이 필요하게 된다.

 

여기서 소개한 함수 말고도 더 정교한 출력을 위해서 strftime() 또는 currTime()등의 함수도 있다.

 

하지만 embedded 개발자인 나로써는 큰 의미가 없어 보인다.

 

 

 

 

'System Program > time' 카테고리의 다른 글

3. Timer and Alarm  (0) 2014.02.24
1. time_t 시간  (0) 2014.02.21
: