[질문] setjmp()와 fgets()/fgetc() 결합시문제
안녕하십니까.
질문이 있어서 글을 올립니다.
아래와 같은 프로그램에서 오류가 발생합니다.
Func(fp, nTimeout)
{
if(nTimeout > 0)
{
.....
if(setjmp(CtxReadTimeout) != 0)
{
return -1; // 1번 부분
}
.....
alarm(nTimeout);
}
cReadChar = getc(fp);
if(cReadChar == EOF)
{
return 0; // 2번 부분
}
return cReadChar;
}
스레드
{
int nResult, nTimeout;
.......
nResult = Func(fp, nTimeout);
if(nResult < 0)
{
printf("실패");
}
fclose(fp);
// 쓰레드 종료
pthread_exit((void *)NULL);
return (PVOID)NULL;
} // 스레드끝
위와 같은 프로그램에서 설정시간동안 데이터가 들어오지 않아
Timeout 에 걸려서 setjmp() 된 경우 return 합니다 (1번 부분)
그런데 1번 부분을 통해 스레드가 종료된뒤 정확히 얘기해서
fclose()가 일어난 후 위의 fget() 부분이 리턴되어 return 2번 부분으로
리턴이 일어납니다. 이렇게 되면 같은 함수에 두번의 return 이 있게 되지요
앞서 일어난 리턴은 정상적이지만 뒤어 일어난 리턴은
Jump to the invalid address stated on the next line
==14368== at 0x0: ???
==14368== Address 0x0 is not stack'd, malloc'd or free'd
과 같이 이미 존재하지 않는 메모리에 접근하게 됩니다
(당연하지요. 위에서 벌써 스레드 리턴이 일어났으니 .......)
위와 같은 현상을 해결할 수 있는 방법이 없을까요..... ??
꼭 해결책을 찾았으면 합니다...
감사합니다 .... 즐거운 하루 되시길 바랍니다 ...
댓글 달기