오픈 되어있는 파일을 외부에서 삭제하였을 경우.
글쓴이: jinoos / 작성시간: 화, 2006/01/24 - 11:46오전
fopen 으로 오픈시켜 close 하지 않고 계속적으로 로그를 기록
시키는 프로그램을 작성했는데 누군가에 의해서 기록되고 있는
파일이 삭제되었다면 코드상에서 알아차리고 예외 처리를 어떻게
해야 할까요?
FILE *fp fp = fopen("/tmp/logfile", "a"); while(1) { fprintf(fp, "Log Message \n"); // ---- 요기 } fclose(fp);
이런 상태에서 "요기" 부분이 동작될때 실제 파일이 삭제 되면 더
이상 기록이 되지 않던데요. 어떻게 이런 상황을 감지 해야 하나
요? 이럴경우 다시 같은 이름의 파일을 만들고 계속 적으로 기록
하려고 하거든요.
미리 감사합니다. ^^
Forums:
fprintf는 함수가 성공하면 실제로 기록한 바이트수를 리턴하고 에러가
fprintf는 함수가 성공하면 실제로 기록한 바이트수를 리턴하고 에러가 발생하면 음수를 리턴하며 errno를 기록합니다.
if(fprintf(fp, "Log Message \n") < 0)
이렇게해서 에러가 발생한 경우에는 그에 적절한 조치를 취하도록 하시면 되지 않을까요?
======================
BLOG : http://superkkt.com
fprintf 의 return 값은 정상적이라고만 나오거든요.[c
fprintf 의 return 값은 정상적이라고만 나오거든요.
if(fprintf(fp, "Log Message \n") < 0)
로는 전혀 잡을수 없어서 그렇습니다.
참고로 FreeBSD 4.11 입니다.
목적을 찾아서... jiNoos
그럼 fprintf 전에 access 함수를 사용해서 파일이 있는지 체크
그럼 fprintf 전에 access 함수를 사용해서 파일이 있는지 체크를 먼저 하는건 어떨까요?
access 함수는 파일이 존재하지 않으면 ENOENT errno를 돌려주니까 이걸 체크해서 파일을 다시 만드는 루틴을 넣으면 될것같은데요..
======================
BLOG : http://superkkt.com
FreeBSD를 사용하신다니 손이 많이 가긴 하지만(?) kqueue를
FreeBSD를 사용하신다니 손이 많이 가긴 하지만(?) kqueue를 이용하실수도 있습니다.
superkkt 님께서 알려주신 방법으로 해결했습니다. ^^ 감사합니다.
superkkt 님께서 알려주신 방법으로 해결했습니다. ^^ 감사합니다.
fox9님 kqueue 로 한다면 어떻게 처리할수 있을까요? 개념이다 중요부분
간단한 코드라도 알려주실수 있으실런지요?
목적을 찾아서... jiNoos
EVFILT_VNODE 이벤트필터를 설정하면 파일의 변경사항(?)등의 정
EVFILT_VNODE 이벤트필터를 설정하면 파일의 변경사항(?)등의 정보들을 읽어올수 있습니다.
아래의 링크를 참조해 보시면 설명이 잘 되어있고
EVFILE_VNODE에 대한 예제 및 기타 예제 파일이 있습니다.
http://www.ifost.org.au/~peterw/kqueue/
[quote="fox9"]EVFILT_VNODE 이벤트필터를 설정하면 파
호... 이런 방법이 있었군요. 감사합니다. ^^ 좀더 연구해봐야겠네요.
목적을 찾아서... jiNoos
일반적으로 그런 문제를 해결하는 가장 이식성 뛰어나고 간단한 방법은, l
일반적으로 그런 문제를 해결하는 가장 이식성 뛰어나고 간단한 방법은, log file을 기록할 필요가 있을 경우 fopen()/fprintf/fclose()를 반복하는 것입니다. 이게 아니면, system specific한 (i.e. kqueue나 inotify같은..) 방법을 쓸 수 밖에 없습니다. Linux에서는 inotify나 dnotify로 검색해 보기 바랍니다.
아니면.. syslog(3)를 쓰는 방법도 있습니다. :)
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
리눅스 커널 버전 2.6 이상이라면 inotify를 사용해 보시길..
리눅스 커널 버전 2.6 이상이라면 inotify를 사용해 보시길..
저도 관련 문서만 읽었고 직접 해 본적은 없지만. 기존의 notify에 비해 상당히 좋아진 느낌을 받았습니다.
싸이트 링크를 하고 싶지만.. 기억이..ㅡ.ㅡ;;
[quote="hie"]리눅스 커널 버전 2.6 이상이라면 inotify
한글로 설명 잘 되어 있는 페이지가 있네요
http://www-128.ibm.com/developerworks/kr/library/l-inotify.html
[quote="fox9"][quote="hie"]리눅스 커널 버전 2.6
이렇게 링크까지.... 감사합니다. 나중에 리눅스로 작업할때 고려해 봐야겠습니다.
목적을 찾아서... jiNoos
댓글 달기