여러가지 방법이 있을 수 있습니다.
저는 그중 alarm() 시스템 호출로 구현한 사례를 권합니다.
int g_isTimeout = 0;
// 시그널 핸들러
static void [b]sig_alrm_handler[/b](int signo)
{
g_isTimeout = 1; // 글로벌
}
test()
{
int timeout;
timeout = 30; // 30 초 타임아웃
if (signal(SIGALRM, [b]sig_alrm_handler[/b]) == SIG_ERR)
시그널등록 에러;// 종료? 리턴?
g_isTimeout = 0; // 글로벌
alarm(timeout); // 타임아웃을 파라메터로 등록
// 이 시스템호출이후 timeout만큼 초(second)가 지나면
// alrm_handler()함수가 호출되고 복귀하게됨
while( ! g_isTimeout ) // !에 유의 한다. 알람 핸들러에서 1로 세팅하게됨
{
// 임의의 코드 수행
}
alarm(0); // 모든 alarm()호출을 초기화시킴
}
다른 방법으로는 다음과 같은 유형을 사용하는 것입니다.
test()
{
int timeout = 30; // 30초
struct timeval start, end, current;
gettimeofday(&start, 0);
end.tv_sec = start.tv_sec + timeout;
// end.tv_usec = start.tv_usec........; // 마이크로초까지 가능하나 여기서는 생략
while ( 1 )
{
gettimeofday(¤t,0);
if ( current.tv_sec - end.tv_sec => 0 )
break;
// 임의의 코드를 수행
}
}
후자의 경우 글로벌 변수를 사용하지 않았습니다.
예를 들어 드린것은 각각 일장일단이 있겠습니다.
그 밖에 타이머를 사용하는 방법 setitimer()등이 있을 수 있습니다.
* 또한 위의 예제의 가정은 "임의의 코드 ..."에서 사용된 루틴이 무한루프
또는 블록킹(blocking)호출을 사용하지 않는다는 가정을 했습니다.
무한루프는 심각하며(코드를 복잡하게 만들게 됨), 모든 블록킹 시스템 호출의
경우는 아무거나 시그널(여기서는 알람시그널)을 받으면 빠지게 되어 있으므로,
전자를 사용하시면 무리없으리라 여겨집니다.
타이머가 좋지 않을까요?
간단한 함수를 작성합니다.
time_set();
timer();
루프 들어가기전에
time_set(20second)
while( timer() )
정도면 되지 않을까요?
전역변수를 쓰는 거라 좋지 않을 수 있지만 ^^
C++이라면 객체하나만 만들면 겁나 쉬운데
제가 C는 잘 몰라서요
C++, 그리고 C++....
죽어도 C++
alarm()을 사용하시면
여러가지 방법이 있을 수 있습니다.
저는 그중 alarm() 시스템 호출로 구현한 사례를 권합니다.
다른 방법으로는 다음과 같은 유형을 사용하는 것입니다.
후자의 경우 글로벌 변수를 사용하지 않았습니다.
예를 들어 드린것은 각각 일장일단이 있겠습니다.
그 밖에 타이머를 사용하는 방법 setitimer()등이 있을 수 있습니다.
* 또한 위의 예제의 가정은 "임의의 코드 ..."에서 사용된 루틴이 무한루프
또는 블록킹(blocking)호출을 사용하지 않는다는 가정을 했습니다.
무한루프는 심각하며(코드를 복잡하게 만들게 됨), 모든 블록킹 시스템 호출의
경우는 아무거나 시그널(여기서는 알람시그널)을 받으면 빠지게 되어 있으므로,
전자를 사용하시면 무리없으리라 여겨집니다.
보탬이 되었기를 ..
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
정말 많은 도움이 되었습니다.도움주신분들께 정말 감사드립니다.
정말 많은 도움이 되었습니다.
도움주신분들께 정말 감사드립니다.
좋은하루되세요
댓글 달기