2009-07-03 7 views
5

현재 log4j 출력에서 ​​XML 파일을보고 있습니다. GUI에서 로그 출력을 표시하는 사용자 정의 뷰어가 있습니다. 이 파일을 업데이트해야 GUI가 다시 구문 분석하고 업데이트 할 수 있습니다. C#에서는 FileWatcher 개념이 Windows no-probs에 있지만 Linux에서는 C를 사용하여 어떤 옵션을 사용합니까?Linux : 다른 프로세스에서 파일을 업데이트했는지 어떻게 알 수 있습니까?

유닉스와 리눅스의 맛 (POSIX 어쩌면) 모두에서 이렇게하는 표준 방법이 있습니까?

감사

답변

6

유닉스/리눅스 시스템에서 파일을 시청할 때 알림 및 폴링의 두 가지 주요 경로가 언급되었습니다.

알림은 시스템 자체 (일반적으로 커널)가 파일에 액세스하거나 쓸 때마다 등록 된 응용 프로그램에 메시지를 트리거하는 경우입니다. 이 접근 방식에는 호환 시스템이 필요하며 구형 시스템에서는 사용하지 못할 수도 있습니다.

Linux에서 알림의 주요 구현은 커널 2.6.13 이상에 내장되어 있으며 2.6.12 및 이전 버전으로 패치 될 수있는 inotify입니다. inotify 사용에 대해서는 뿐 아니라 inetify 액세스 용 기본 set of tools and C library이 있습니다.

폴링은 프로그램이 주기적으로 파일을 검사하여 파일 크기, 최종 수정 시간, 소유자 등이 변경되었는지 여부를 확인합니다.

poll 시스템 호출이 있지만이 목적을 위해 유용한 것으로 보이지만 시스템 수준이 아닌 프로그램 수준으로 작성되었으므로이 표준 구현은 없습니다 (맨 페이지에 select과 비슷합니다). , 파일 디스크립터에서 이벤트가 사용 가능해질 때까지 기다린다). stat으로 좀 더 기본적인 접근법을 취할 수 있으며 직접 확인하십시오.

+0

설명해 주셔서 감사합니다. –

+0

나는 poll()이 도움이 될지 의심 스럽다. poll()이하는 일을 오해 한 것 같습니다. * inotify와 함께 * 사용하지 않는 한. – Thomas

+0

명확히하기 위해 : poll()은 "이 파일을 지금 읽으면() 그 블록이됩니까?" 또는 "최대 3 초 동안 기다리거나이 파일 설명자 중 하나 이상에서 read() 차단없이 읽을 수있을 때까지". – Thomas

6

당신은 inotify 같은 뭔가를 찾고 계십니까?

또는 stat을 사용하여 파일을 폴링 할 수 있습니다.

+0

내 요구 사항을 완벽하게 충족 시키지만 표준 C API를 사용하여 휠을 다시 작성하고 코드를 작성해야한다고 생각합니다. 그래서 거기에 간단한 fstat 및 stat API를 사용하여 그것을 할 수있는 기회가 무엇입니까? –

+0

당신은 그것을 분명히하고 싶을 것입니다 ... 만약 당신이 필요로하는 것과 같은 inotify 소리가 나고, 리눅스에 있다면, 왜 그것을 사용하지 않을 수 있습니까? – unwind

0

리눅스이 름인 inotify보다 이식성이 뛰어난 것을 원한다면 더 오래되고 더 이식 가능한 기술인 File Alteration Monitor을 살펴보십시오. 반면 NFS 마운트 파일 시스템에서는 응용 프로그램에 따라 중요 할 수있는 유용한 기능을 수행합니다.

+0

제안에 감사드립니다. 특히 커널에 독립적이며 NFS 마운트 시스템에서 작동합니다. –

관련 문제