2017-02-08 2 views
1

Ich versuche inotify_add_watch zu rufen, um eine Datei zu sehen. Ich möchte die Datei relativ zu einem O_PATH | angeben O_DIRECTORY-Dateideskriptor, a la symlinkat, fstatat oder openat.inotify_add_watch relativ zu O_PATH dirfd

Ist das möglich? Es sieht nicht so aus. Wer kennt einen Workaround?

EDIT

Die nächste Sache der "Trick" bei man 2 open unter "Hintergrund für openat" beschrieben zu sein scheint. Ein Beispiel finden Sie in der Antwort von user1643723.

+0

Haben Sie (ab) procfs probiert? Wenn Sie die Funktionalität von XXXat-Syscalls emulieren möchten, ist es immer eine gute Idee, '/ proc/self/fd/

/filename' auszuprobieren. – user1643723

+0

Ich bekomme ENOTDIR, wenn ich pass Pfad wie/proc/self/fd/6/foo zu inotify_add_watch verwenden –

+0

Es gibt eine Art von Fehler in Ihrem Code. Entweder schließen Sie den Verzeichnisdeskriptor zu früh, oder Sie verwenden nicht den richtigen Deskriptor an erster Stelle. Bitte sehen Sie meine Antwort für den Arbeitscode. – user1643723

Antwort

0

können Sie symbolische Links verwenden, zur Verfügung gestellt von procfs die Funktionalität der meisten * bei Anrufe zu erreichen. Öffnen Sie ein Verzeichnis-Descriptor und verwenden /proc/self/fd/<dir descriptor>/filename anstelle des vollständigen Pfad zu Dateiname:

#define _GNU_SOURCE 

#include <sys/stat.h> 
#include <sys/inotify.h> 
#include <sys/types.h> 

#include <fcntl.h> 
#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <unistd.h> 

int main() { 
    int inotify = inotify_init(); 

    mkdir("tmp", 0777); 
    mknod("tmp/foo", 0777 | S_IFREG, 0); 

    int dirFd = open("tmp", O_DIRECTORY | O_PATH); 

    char buf[40] = { '\0' }; 

    sprintf(buf, "/proc/self/fd/%d/foo", dirFd); 

    int watchd = inotify_add_watch(inotify, buf, IN_MOVE | IN_ATTRIB); 

    if (watchd < 0) { 
     printf("Failed: %s", strerror(errno)); 
    } else { 
     printf("ok"); 
    } 
} 

Das obige Programm druckt „ok“ auf Linux 4.4.x.

+0

Sie haben O_PATH nicht verwendet. Ich muss auch in der Lage sein, diesen Dateideskriptor an das richtige * bei syscalls (wie fstatat, usw.) zu übergeben. –

+0

Entschuldigung, ich habe den Code aktualisiert, um O_PATH zu verwenden. Funktioniert immer noch gut für mich. Beachten Sie, dass Sie O_PATH nicht mit * bei syscalls verwenden müssen - sie arbeiten nur mit normalen Dateideskriptoren. – user1643723

+0

Ich denke, das ist der "Trick", der unter http://man7.org/linux/man-pages/man2/open.2.html unter Rationale beschrieben wird. Halten Sie immer noch für richtig * bei der Unterstützung für inotify. –

Verwandte Themen