linux - descargar - inotify os11
Cómo usar inotify? (3)
Quiero usar el mecanismo de inotify
en Linux. Quiero que mi aplicación sepa cuándo se modificó un archivo aaa
. ¿Me puede dar una muestra de cómo hacerlo?
A continuación se muestra un fragmento de cómo puede utilizar inotify para ver "aaa". Tenga en cuenta que no lo he probado, ¡ni siquiera lo he compilado! Deberá agregarle una verificación de errores.
En lugar de utilizar una lectura de bloqueo, también puede usar sondear / seleccionar en inotfd.
const char *filename = "aaa";
int inotfd = inotify_init();
int watch_desc = inotify_add_watch(inotfd, filename, IN_MODIFY);
size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1;
struct inotify_event* event = malloc(bufsiz);
/* wait for an event to occur */
read(inotfd, event, bufsiz);
/* process event struct here */
Dado que la pregunta inicial parece mencionar a Qt como una etiqueta como se señala en varios comentarios aquí, los motores de búsqueda pueden haberte guiado hasta aquí.
Si alguien quiere saber cómo hacerlo con Qt, vea http://doc.qt.io/qt-5/qfilesystemwatcher.html para la versión Qt. En Linux usa un subconjunto de Inotify, si está disponible, ver la explicación en la página de Qt para más detalles.
Básicamente, el código necesario se ve así:
en mainwindow.h agregar:
QFileSystemWatcher * watcher;
private slots:
void directoryChanged(const QString & path);
void fileChanged(const QString & path);
y para mainwindow.cpp:
#include <QFileInfo>
#include <QFileSystemWatcher>
watcher = new QFileSystemWatcher(this);
connect(watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChanged(const QString &)));
connect(watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &)));
watcher->addPath("/tmp/"); // watch directory
watcher->addPath("/tmp/a.file"); // watch file
también agregue las ranuras en mainwindow.cpp que se llaman si se nota un cambio de archivo / directorio:
void MainWindow::directoryChanged(const QString & path) {
qDebug() << path;
}
void MainWindow::fileChanged(const QString & path) {
qDebug() << path;
}
- Documentación (desde la actividad del sistema de archivos del Monitor con inotify )
La API C de inotify
Inotify proporciona tres llamadas al sistema para crear monitores de sistema de archivos de todo tipo:
- inotify_init () crea una instancia del subsistema inotify en el kernel y devuelve un descriptor de archivo en caso de éxito y -1 en caso de error. Al igual que otras llamadas al sistema, si inotify_init () falla, verifique errno para el diagnóstico.
- inotify_add_watch (), como su nombre lo indica, agrega un reloj. Cada reloj debe proporcionar una ruta de acceso y una lista de eventos pertinentes, donde cada evento se especifica mediante una constante, como IN_MODIFY. Para monitorear más de un evento, simplemente use el operador lógico or-the pipe (|) en C-entre cada evento. Si inotify_add_watch () tiene éxito, la llamada devuelve un identificador único para el reloj registrado; de lo contrario, devuelve -1. Use el identificador para alterar o eliminar el reloj asociado.
- inotify_rm_watch () elimina un reloj.
Las llamadas al sistema read () y close () también son necesarias. Dado el descriptor generado por inotify_init (), llame a read () para esperar alertas. Suponiendo un descriptor de archivo típico, la aplicación bloquea la recepción de eventos, que se expresan como datos en la transmisión. El cierre común () en el descriptor de archivo obtenido de inotify_init () elimina y libera todos los relojes activos así como también toda la memoria asociada a la instancia de inotify. (La advertencia de recuento de referencia típica se aplica aquí también. Todos los descriptores de archivo asociados con una instancia deben cerrarse antes de que la memoria consumida por los relojes y por inotify se libere).
- Un ejemplo (de Kernel Korner - Introducción a inotify )
#include "inotify.h" #include "inotify-syscalls.h" int wd; wd = inotify_add_watch (fd, "/home/rlove/Desktop", IN_MODIFY | IN_CREATE | IN_DELETE); if (wd < 0) perror ("inotify_add_watch");
Este ejemplo agrega un reloj en el directorio / home / rlove / Desktop para cualquier modificación, creación de archivos o eliminación de archivos.