fopen이 null로 떨어지는 이유???

poiq1의 이미지

안녕하세요

리눅스 환경에서 개발하고 있는중인데요..

서버 프로그램으로 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;
}
}

areios의 이미지

errno 확인해보세요.

poiq1의 이미지

errno로 확인해본 결과 24번으로 오류가 떨어집니다.

메시지를 확인해보니

Too many open files

라고 나왓구여..

파일을 너무 많이 오픈을 했다... 인거 같은데요..

fclose로 메모리 해제한게 맞는데... 정상적으로 해제가 안댄걸 뜻하는건가요?

areios의 이미지

코드상으로 봐서는 잘 모르겠네요.

로그를 이용해 보시는게 어떨가요?

오픈할때와 클로즈할때 기타등등..

ymir의 이미지

lsof -p [pid] 로 찍어 보세요.
프로세스가 어떤 파일들을 열고 있는지 확인할 수 있습니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

areios의 이미지

몰랐던거 배워갑니다.

감사합니다.

poiq1의 이미지

헠...감사합니다... 그렇군요..

그런데 한가지 궁금한게 있습니다.

sqlite3 를 사용해서요.. 분명 파일을 ProdMst.db를 여는게 맞습니다.

그리고 나서 닫아주는데요...

답변해주신 방법으로 열어보니.. ProdMst.db가 좌르르륵;;;;

그런데 맨 뒤에 (deleted)라는 문구가 잇는데... 삭제 댓다는뜻 아닌가요??

왜? 계속 파일 오픈한 카운트가 올라가는지 모르겠습니다.

저기에서 (deleted)란 뜻은 무엇인가요?

ymir의 이미지

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 』

areios의 이미지

정확히 어떤 용도로 사용하시는건지 모르겠으나..

sqlite하고 개발하신 프로그램하고 db파일을 공유하는 방식이라면 문제가 생기는것으로 알고있습니다.

테스트를 목적으로 더미 파일을 만들어서 파일을 공유하지 않고 해보시는것도 괜찮을꺼 같네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.