Come ricevere una notifica del cambio di file/directory in C/C++, idealmente utilizzando POSIX

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

  •  09-06-2019
  •  | 
  •  

Domanda

L'argomento dice tutto: normalmente il modo più semplice e multipiattaforma è eseguire sondaggi in modo intelligente.Ma ogni sistema operativo dispone di alcuni mezzi per inviare notifiche senza polling.È possibile in modo ragionevolmente multipiattaforma?(Mi interessano solo Windows e Linux, ma uso Mac, quindi ho pensato che posix potesse aiutare?)

È stato utile?

Soluzione

Gli utenti Linux possono utilizzare notificare

Inotify è un sottosistema del kernel Linux che fornisce una notifica degli eventi del file system.

Alcune chicche per gli utenti Windows:

Altri suggerimenti

La libreria Qt ha un file QFileSystemWatcher classe che fornisce notifiche multipiattaforma quando un file cambia.Anche se non stai utilizzando Qt, poiché il sorgente è disponibile, potresti dargli un'occhiata come esempio per la tua implementazione.Qt ha implementazioni separate per Windows, Linux e Mac.

C'è API degli eventi del file system a partire da Leopardo.

Non penso che POSIX stesso abbia strutture per questo.Il più vicino al multipiattaforma che ho visto è FAM, che sembra funzionare per Linux, BSD e Irix, ma non sono sicuro che sarebbe facile portarlo su Windows e MacOS.

In realtà ho già creato questo sistema per utilizzarlo in una base di codice C++ commerciale: a patto che non ti servano tutte le cose strane sotto il sole, i sistemi Windows e POSIX hanno molte sovrapposizioni che puoi astrarre.

POSITIVO:Usa inotify: è un intero sistema letteralmente creato per questo lavoro
Finestre:Usa "cambia eventi".Devi creare più colla e creare report tu stesso (tutte le API di cui hai bisogno sono disponibili, semplicemente non c'è lo sportello unico che inotify ti offre).

Le cose comuni che puoi rilevare nel tuo "thread di notifica" per l'inoltro di eventi sono:
1) Fondamentalmente qualsiasi operazione invasiva supporta boost::filesystem, con la (possibile) eccezione della modifica delle autorizzazioni.Si tratta di cose come spostare, creare, eliminare, copiare cartelle e file.
2) Legge e scrive su file (esp.scrive).Tieni presente che se utilizzi l'I/O asincrono le notifiche possono essere visualizzate fuori ordine.
3) Quando arriva un nuovo volume, ad esempio qualcuno che collega un'unità flash.

inotify in particolare ti offre un livello folle di controllo granulare, Windows meno.Con inotify puoi letteralmente monitorare tutto ciò che il filesystem sta facendo quasi in tempo reale, se lo desideri davvero.So che il punto 3 è possibile con entrambi senza polling, ma tieni presente che può essere davvero complicato farlo funzionare correttamente su entrambi i sistemi.

Credo che OS X ora disponga di hook/callback appropriati perché erano necessari per l'indicizzazione Spotlight.

Su Linux avrai il problema aggiuntivo che comunemente vengono utilizzati più file system.Se hai bisogno della funzionalità solo per un numero limitato di file/directory, proverei a cercare attivamente le modifiche a intervalli regolari.

libevent O libev sembrano essere quello che vuoi, anche se non li ho usati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top