[질문] setjmp()와 fgets()/fgetc() 결합시문제

pjs0722의 이미지

안녕하십니까.

질문이 있어서 글을 올립니다.

아래와 같은 프로그램에서 오류가 발생합니다.

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

과 같이 이미 존재하지 않는 메모리에 접근하게 됩니다

(당연하지요. 위에서 벌써 스레드 리턴이 일어났으니 .......)

위와 같은 현상을 해결할 수 있는 방법이 없을까요..... ??

꼭 해결책을 찾았으면 합니다...

감사합니다 .... 즐거운 하루 되시길 바랍니다 ...