2014-12-08 1 views
1

관심이있는 파일이 내 응용 프로그램이 아닌 다른 것으로 변경된 경우이를 감지하는 파일 모니터링 서비스를 구현하는 클래스가 있습니다. 나는 파일을 열고 (O_EVTONLY 플래그로) 파일 기술자를 DISPATCH_SOURCE_TYPE_VNODE 타입의 그랜드 센트럴 디스패치 소스에 바인딩하는 표준 기술을 사용한다. 이벤트가 생기면 메인 스레드에 NSNotificationCenterpostNotificationName:object:userInfo:을 알리고 내 애플리케이션 대리인에게 옵저버를 호출합니다. 여태까지는 그런대로 잘됐다. 그것은 위대한 작품. 하지만 일반적으로 트리거 이벤트가 속성 변경 인 경우 (즉, 플래그가 dispatch_source_get_data()에서 반환 될 때 설정 됨) 보통 간격이 두 개인 이벤트가 발생합니다. 모니터링중인 객체가 touch(1) 인 경우 문제가 쉽게 표시됩니다. 나는 이것이 파일의 mtime과 atime이 비 원자 적으로 설정 되었기 때문에 이것이 사실 일지는 모르지만 나는 이것을 검증 할 수 없다고 가정한다. 이것은 내 관찰자에게 보내지는 허위 통보로 이어질 수 있으며 경쟁 조건 등이 발생할 수 있습니다.GCD 파일 시스템 이벤트 합치기

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 나는 마지막 이벤트가 수신 된 타임 스탬프를 저장하고 현재 이벤트가이 타임 스탬프보다 일정 시간 (수십 밀리 초) 뒤에있는 경우에만 알림을 보냈다 고 생각했습니다. 합리적인 솔루션처럼 들릴까요?

답변

3

프로세스의 GCD 이벤트 소스에 대한 알림이 다른 프로세스의 기본 파일 수정과 동기가 없기 때문에이 상황에서 "경쟁 조건"을 벗어날 수 없습니다. 그러므로, 무엇이든지간에, 항상에 대한 통보를 받고있는 변경 사항이 이미 "사라 졌을"수 있습니다.

합체에 관해서는, 당신의 애플 리케이션에 맞는 것을하십시오. 두 가지 분명한 전략이 있습니다. 받은 이벤트에 대해 즉시 조치를 취한 다음 일정 시간대에 수신 된 후속 이벤트를 마루에 떨어 뜨리거나 마루에있는 동일한 파일에 대한 다른 이벤트를 삭제하는 일정 기간 동안 모든 이벤트를 지연시킬 수 있습니다. 정말 그냥 더 중요한 무엇을 (당신이 확인 일이 대기하다 할 수 없다 알면서.) 신속하게 행동하거나, 정지 상태의 높은 가능성을 가지고에 따라

내가 추가 할 수있는 유일한 방법은 제안하는 것입니다 당신은 의 모든 합병을 수행하여이 주 스레드에 무엇인가를 파견합니다. 주 스레드는 추적 루프와 같은 것들을 가지고 있습니다. 어떤 경우에는 시간 기반 병합을 어렵게 만듭니다.

+0

감사합니다. 나는 첫 번째 옵션을 사용하여 이벤트가 수신 된 시간 (모니터 클래스에 저장 됨)을 이전 이벤트와 비교하고 창이있는 경우 무시합니다. 추가로 이상한 일이 발생합니다. 특정 파일 만 이중 이벤트를 제공하며 최대 2 초까지 지연 될 수 있습니다. 또한 모달 경고를 표시하면 모든 내용이 차단되므로 두 번째 이벤트는 반환 될 때까지 연기됩니다. 내 알림 처리기에서 수신 된 모든 것을 버리고 경고가 해제 된 후 제한 시간대를 연장합니다. 그것은 효과가 있지만 나는 그것에 대해 너무 기뻐하지 않습니다. –