POSIX를 사용하여 C/C++에서 파일/디렉터리 변경에 대한 알림을 받는 방법

StackOverflow https://stackoverflow.com/questions/61253

  •  09-06-2019
  •  | 
  •  

문제

주제는 모든 것을 말해줍니다. 일반적으로 쉽고 크로스 플랫폼 방식은 지능적으로 여론 조사를 하는 것입니다.그러나 모든 OS에는 폴링 없이 알릴 수 있는 방법이 있습니다.합리적으로 크로스 플랫폼 방식으로 가능합니까?(저는 Windows와 Linux에만 관심이 있지만 Mac을 사용하므로 posix가 도움이 될 것이라고 생각했습니다.)

도움이 되었습니까?

해결책

Linux 사용자는 다음을 사용할 수 있습니다. inotify

Inotify는 파일 시스템 이벤트 알림을 제공하는 Linux 커널 서브 시스템입니다.

Windows 동료를 위한 몇 가지 혜택:

다른 팁

Qt 라이브러리에는 QFileSystemWatcher 파일이 변경되면 크로스 플랫폼 알림을 제공하는 클래스입니다.Qt를 사용하지 않더라도 소스가 제공되므로 직접 구현하기 위한 샘플로 살펴볼 수 있습니다.Qt는 Windows, Linux 및 Mac에 대해 별도의 구현을 가지고 있습니다.

있다 파일 시스템 이벤트 API 레오파드만큼.

POSIX 자체에는 해당 기능이 없다고 생각합니다.내가 본 크로스 플랫폼에 가장 가까운 것은 , 이는 Linux, BSD 및 Irix에서 작동하는 것으로 보이지만 Windows 및 MacOS로 이식하는 것이 얼마나 쉬운지는 모르겠습니다.

나는 실제로 상용 C++ 코드 베이스에 사용하기 위해 이 시스템을 구축한 적이 있습니다. 태양 아래서 이상한 것이 모두 필요하지 않은 한 Windows와 POSIX 시스템은 추상화할 수 있는 중복되는 부분이 많습니다.

POSIX:inotify를 사용하세요. 말 그대로 이 작업을 위해 구축된 전체 시스템입니다.
윈도우:"변경 이벤트"를 사용하십시오.더 많은 접착제와 보고 기능을 직접 구축해야 합니다(필요한 모든 API를 사용할 수 있지만 원스톱 쇼핑 inotify가 제공하는 것은 없습니다).

이벤트 전달에 대한 "알림 스레드"에서 감지할 수 있는 일반적인 사항은 다음과 같습니다.
1) 기본적으로 권한 수정을 제외하고 모든 침입 작업 Boost::filesystem이 지원됩니다.이는 폴더 및 파일 이동, 생성, 삭제, 복사와 같은 작업입니다.
2) 파일을 읽고 씁니다(특히쓴다).비동기 I/O를 사용하는 경우 알림이 순서 없이 표시될 수 있다는 점에 유의하세요.
3) 누군가 플래시 드라이브를 연결하는 등 새 볼륨이 들어오는 경우.

특히 inotify는 미친 수준의 세밀한 제어 기능을 제공하지만 Windows에서는 그렇지 않습니다.inotify를 사용하면 정말로 원할 경우 파일 시스템이 수행하는 모든 작업을 거의 실시간으로 문자 그대로 모니터링할 수 있습니다.나는 폴링 없이 두 가지 모두에서 #3이 가능하다는 것을 알고 있지만, 두 시스템 모두에서 올바르게 작동하도록 하는 것은 정말 까다로울 수 있다는 점에 유의하십시오.

저는 이제 OS X에 Spotlight 인덱싱에 필요했기 때문에 적절한 후크/콜백이 있다고 생각합니다.

Linux에서는 일반적으로 사용되는 파일 시스템이 여러 개 있다는 추가적인 문제가 있습니다.제한된 양의 파일/디렉토리에 대해서만 기능이 필요한 경우 정기적으로 적극적으로 수정 사항을 찾아 보겠습니다.

libevent 또는 리브브 당신이 원하는 것 같지만 나는 그것을 사용하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top