오픈 되어있는 파일을 외부에서 삭제하였을 경우.

jinoos의 이미지

fopen 으로 오픈시켜 close 하지 않고 계속적으로 로그를 기록
시키는 프로그램을 작성했는데 누군가에 의해서 기록되고 있는
파일이 삭제되었다면 코드상에서 알아차리고 예외 처리를 어떻게
해야 할까요?

FILE *fp

fp = fopen("/tmp/logfile", "a");

while(1)
{
    fprintf(fp, "Log Message \n");  // ---- 요기
}

fclose(fp);

이런 상태에서 "요기" 부분이 동작될때 실제 파일이 삭제 되면 더
이상 기록이 되지 않던데요. 어떻게 이런 상황을 감지 해야 하나
요?
이럴경우 다시 같은 이름의 파일을 만들고 계속 적으로 기록
하려고 하거든요.

미리 감사합니다. ^^

superkkt의 이미지

fprintf는 함수가 성공하면 실제로 기록한 바이트수를 리턴하고 에러가 발생하면 음수를 리턴하며 errno를 기록합니다.

if(fprintf(fp, "Log Message \n") < 0)

이렇게해서 에러가 발생한 경우에는 그에 적절한 조치를 취하도록 하시면 되지 않을까요?

======================
BLOG : http://superkkt.com

jinoos의 이미지

fprintf 의 return 값은 정상적이라고만 나오거든요.

if(fprintf(fp, "Log Message \n") < 0)

로는 전혀 잡을수 없어서 그렇습니다.

참고로 FreeBSD 4.11 입니다.

목적을 찾아서... jiNoos

superkkt의 이미지

그럼 fprintf 전에 access 함수를 사용해서 파일이 있는지 체크를 먼저 하는건 어떨까요?

access 함수는 파일이 존재하지 않으면 ENOENT errno를 돌려주니까 이걸 체크해서 파일을 다시 만드는 루틴을 넣으면 될것같은데요..

======================
BLOG : http://superkkt.com

fox9의 이미지

FreeBSD를 사용하신다니 손이 많이 가긴 하지만(?) kqueue를 이용하실수도 있습니다.

jinoos의 이미지

superkkt 님께서 알려주신 방법으로 해결했습니다. ^^ 감사합니다.

fox9님 kqueue 로 한다면 어떻게 처리할수 있을까요? 개념이다 중요부분
간단한 코드라도 알려주실수 있으실런지요?

목적을 찾아서... jiNoos

fox9의 이미지

EVFILT_VNODE 이벤트필터를 설정하면 파일의 변경사항(?)등의 정보들을 읽어올수 있습니다.

아래의 링크를 참조해 보시면 설명이 잘 되어있고
EVFILE_VNODE에 대한 예제 및 기타 예제 파일이 있습니다.

http://www.ifost.org.au/~peterw/kqueue/

jinoos의 이미지

fox9 wrote:
EVFILT_VNODE 이벤트필터를 설정하면 파일의 변경사항(?)등의 정보들을 읽어올수 있습니다.

아래의 링크를 참조해 보시면 설명이 잘 되어있고
EVFILE_VNODE에 대한 예제 및 기타 예제 파일이 있습니다.

http://www.ifost.org.au/~peterw/kqueue/

호... 이런 방법이 있었군요. 감사합니다. ^^ 좀더 연구해봐야겠네요.

목적을 찾아서... jiNoos

cinsk의 이미지

일반적으로 그런 문제를 해결하는 가장 이식성 뛰어나고 간단한 방법은, log file을 기록할 필요가 있을 경우 fopen()/fprintf/fclose()를 반복하는 것입니다. 이게 아니면, system specific한 (i.e. kqueue나 inotify같은..) 방법을 쓸 수 밖에 없습니다. Linux에서는 inotify나 dnotify로 검색해 보기 바랍니다.

아니면.. syslog(3)를 쓰는 방법도 있습니다. :)

hie의 이미지

리눅스 커널 버전 2.6 이상이라면 inotify를 사용해 보시길..
저도 관련 문서만 읽었고 직접 해 본적은 없지만. 기존의 notify에 비해 상당히 좋아진 느낌을 받았습니다.

싸이트 링크를 하고 싶지만.. 기억이..ㅡ.ㅡ;;

fox9의 이미지

hie wrote:
리눅스 커널 버전 2.6 이상이라면 inotify를 사용해 보시길..
저도 관련 문서만 읽었고 직접 해 본적은 없지만. 기존의 notify에 비해 상당히 좋아진 느낌을 받았습니다.

싸이트 링크를 하고 싶지만.. 기억이..ㅡ.ㅡ;;


한글로 설명 잘 되어 있는 페이지가 있네요

http://www-128.ibm.com/developerworks/kr/library/l-inotify.html

jinoos의 이미지

fox9 wrote:
hie wrote:
리눅스 커널 버전 2.6 이상이라면 inotify를 사용해 보시길..
저도 관련 문서만 읽었고 직접 해 본적은 없지만. 기존의 notify에 비해 상당히 좋아진 느낌을 받았습니다.

싸이트 링크를 하고 싶지만.. 기억이..ㅡ.ㅡ;;


한글로 설명 잘 되어 있는 페이지가 있네요

http://www-128.ibm.com/developerworks/kr/library/l-inotify.html

이렇게 링크까지.... 감사합니다. 나중에 리눅스로 작업할때 고려해 봐야겠습니다.

목적을 찾아서... jiNoos

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.