fopen이 null로 떨어지는 이유???
안녕하세요
리눅스 환경에서 개발하고 있는중인데요..
서버 프로그램으로 10초마다 기동이 대는데
fopen 함수에서 자꾸 null로 떨어집니다.
문제는 초기기동때는 문제가 없습니다만... 대략 2시간 정도 지난 후 null로 떨어집니다.
fopen은 450번 정도 하는거 같구요..
어느 분의 글을 읽어보았는데.. fopen한 후 fclose를 안하게 되면... fopen를 계속 하다 그다음부터는 open할수 없어서
null로 떨어진다...라는 글을 읽었는데..
음.. 다시 코드를 확인해봐도 fclose를 안해준건 아닌데... 이유를 모르겟습니다.
문제가 되는 함수를 올립니다.
이 함수가 10초마다 호출이 됩니다.
int GetSysParameter(char *szFileName, char *szSecName, char * szItmName, char *szValue)
{
char szTmpBuf[SYSPARM_MAX_LEN + 1];
int nFind;
int nSecLen, nItmLen;
int nPos;
FILE *fp;
fp = fopen(szFileName, "r");
if (fp == NULL)
{
printf("환경파일 읽지 못함\n");
printf("szFileName = %s\n", szFileName);
printf("szSecName = %s\n", szSecName);
printf("szItmName = %s\n", szItmName);
printf("환경파일 읽지 못함\n");
return -1;
}
nSecLen = strlen(szSecName);
nItmLen = strlen(szItmName);
nFind = FALSE;
while (TRUE)
{
memset(szTmpBuf, 0x00, sizeof(szTmpBuf));
if ( fgets(szTmpBuf, SYSPARM_MAX_LEN, fp) == NULL )
break;
if ( szTmpBuf[0] == ';' )
continue;
if ( strncmp(szSecName, szTmpBuf, nSecLen) == 0 )
{
while(TRUE)
{
memset(szTmpBuf, 0x00, sizeof(szTmpBuf));
if ( fgets(szTmpBuf, SYSPARM_MAX_LEN, fp) == NULL )
break;
if ( strncmp(szItmName, szTmpBuf, nItmLen) == 0 )
{
nPos = CheckCharPosition(szTmpBuf, '=');
if (nPos == -1) break;
strcpy(szValue, &szTmpBuf[nPos + 1]);
if ( szValue[strlen(szValue) - 1] == '\n' )
szValue[strlen(szValue) - 1] = 0x00;
nFind = TRUE;
}
if ( szTmpBuf[0] == '[' )
break;
} // while(TRUE)
break;
}
} // while(TRUE)
fclose(fp);
if (nFind == TRUE)
return 0;
else
{
printf("파일내용을 읽지 못함\n");
printf("szFileName = %s\n", szFileName);
printf("szSecName = %s\n", szSecName);
printf("szItmName = %s\n", szItmName);
printf("파일내용을 읽지 못함\n");
return -2;
}
}
errno 확인해보세요.
errno 확인해보세요.
errno를 확인해보았는데요.
errno로 확인해본 결과 24번으로 오류가 떨어집니다.
메시지를 확인해보니
Too many open files
라고 나왓구여..
파일을 너무 많이 오픈을 했다... 인거 같은데요..
fclose로 메모리 해제한게 맞는데... 정상적으로 해제가 안댄걸 뜻하는건가요?
글쎄요..
코드상으로 봐서는 잘 모르겠네요.
로그를 이용해 보시는게 어떨가요?
오픈할때와 클로즈할때 기타등등..
음 ..
lsof -p [pid] 로 찍어 보세요.
프로세스가 어떤 파일들을 열고 있는지 확인할 수 있습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
오!
몰랐던거 배워갑니다.
감사합니다.
오...
헠...감사합니다... 그렇군요..
그런데 한가지 궁금한게 있습니다.
sqlite3 를 사용해서요.. 분명 파일을 ProdMst.db를 여는게 맞습니다.
그리고 나서 닫아주는데요...
답변해주신 방법으로 열어보니.. ProdMst.db가 좌르르륵;;;;
그런데 맨 뒤에 (deleted)라는 문구가 잇는데... 삭제 댓다는뜻 아닌가요??
왜? 계속 파일 오픈한 카운트가 올라가는지 모르겠습니다.
저기에서 (deleted)란 뜻은 무엇인가요?
음 ..
lsof 의 결과에 deleted 가 나오는 것은 open 된 상태에서 파일이 삭제된 경우일겁니다.
sqlite 쪽은 안 써봐서 잘은 모르겠지만..
db handle 을 계속 열고 닫지 않았다거나.. 했을 수도 있을 것 같습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
...
정확히 어떤 용도로 사용하시는건지 모르겠으나..
sqlite하고 개발하신 프로그램하고 db파일을 공유하는 방식이라면 문제가 생기는것으로 알고있습니다.
테스트를 목적으로 더미 파일을 만들어서 파일을 공유하지 않고 해보시는것도 괜찮을꺼 같네요.
댓글 달기