Superkkt Blog

순수한 어플리케이션 레벨에서 이 기능을 구현하려면 상당히 복잡하고 비싼 연산을 해야만 한다. 그러나 커널 레벨에서 지원해주는 기능을 사용한다면 쉽게 할 수 있다.

우선 dnotify라는 커널 서브시스템이 있다. 그러나 dnotify는 오직 디렉토리 단위로만 감시를 할 수 있어서 사용자가 변경된 파일을 직접 찾아야 하는 문제가 있고, 또 감시할 디렉토리마다 별도의 파일 디스크립터를 만들어야 하는 단점이 있다. 어플리케이션과의 인터페이스는 시그널을 통해서 하게 된다.

그래서 이런 문제점들을 수정한 inotify가 등장했고, 2005년에 커널 2.6.13 버전에 포함되었다. inotify는 /dev/inotify라는 디바이스를 사용해서 사용자 어플리케이션과 인터페이스한다. 그리고 파일 단위로 변경 사항을 감시 할 수 있고 감시하는 파일마다 파일 디스크립터를 만들 필요가 없다. /dev/inotify 디바이스는 select나 poll 함수를 통해서 폴링 할 수 있기 때문에 기존에 dnotify가 사용하던 시그널 전달 방식에 비해 이식성이나 안정성이 우수하다.

http://en.wikipedia.org/wiki/Inotify

아래는 자세한 설명과 예제 코드가 있는 사이트이다.

http://www.linuxjournal.com/article/8478
http://www.ibm.com/developerworks/linux/library/l-inotify/index.html?ca=drs-

그리고 inotify-tools라는 inotify를 기반으로 만들어진 라이브러리 및 명령어 집합이 있다. 사용해보지는 않았지만 직접 inotify 인터페이스를 사용하는것보다 좀 더 쉬우려나?

http://inotify-tools.sourceforge.net/

그리고 FAM도 있다. FAM은 back-end에서 inotify를 사용하는지는 모르겠지만 아무튼 데몬 형태로 실행되고, 사용자 어플리케이션은 이 데몬과 통신해서 원하는 파일이나 디렉토리를 감시할 수 있다.

http://oss.sgi.com/projects/fam/


inotify는 디렉토리를 recursive하게 감시해주지 않는다. 그래서 사용자가 모든 하위 디렉토리를 명시적으로 감시해야 하는데, 문제는 최대 watch의 기본 개수가 8192이다. 확장 가능하다고 하지만 한계가 있어서 대용량 시스템에서는 사용이 불가능하다.

이런 문제를 해결한 fschange라는 프로그램이 있는데, 문제는 커널 패치를 해야 한다는 점이다. 젠장..


<관련 글>
http://superkkt.com/375
2008/02/05 20:11 2008/02/05 20:11

trackbacks

trackbacks rss

이 글에는 트랙백을 보낼 수 없습니다

Leave a Comment