2017-02-08 21 views
1

Я пытаюсь позвонить inotify_add_watch, чтобы посмотреть файл. Я хотел бы указать файл относительно O_PATH | O_DIRECTORY, a la symlinkat, fstatat, или openat.inotify_add_watch относительно O_PATH dirfd

Возможно ли это? Это не похоже. Кто-нибудь знает об обходном пути?

EDIT

Самое близкое, кажется, «трюк», описанный в man 2 open под «Обоснование openat». См. Ответ пользователя1643723 для примера.

+0

Вы пытались (ab) использовать procfs? Когда вы хотите эмулировать функциональность системных вызовов XXXat, всегда полезно попробовать «/ proc/self/fd/

/filename». – user1643723

+0

Я получаю ENOTDIR, когда использую путь прохождения, например/proc/self/fd/6/foo, toototify_add_watch –

+0

В коде есть какая-то ошибка. Либо вы закрываете дескриптор каталога слишком рано, либо не используете правильный дескриптор в первую очередь. Пожалуйста, см. Мой ответ для рабочего кода. – user1643723

ответ

0

Вы можете использовать символические ссылки, предоставленные PROCFS для достижения функциональности большинства * на звонков. Открыть дескриптор каталога и использовать /proc/self/fd/<dir descriptor>/filename вместо полного пути к файла:

#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"); 
    } 
} 

Программа выше гравюр «OK» на Linux 4.4.x.

+0

Вы не использовали O_PATH. Мне также нужно иметь возможность передать этот дескриптор файла правильно * в syscalls (например, fstatat и т. Д.). –

+0

Извините, я обновил код для использования O_PATH. Все еще отлично работает для меня. Обратите внимание, что у вас нет ** ** использовать O_PATH с * в syscalls - они работают только с обычными файловыми дескрипторами. – user1643723

+0

Я думаю, что это «трюк», описанный в http://man7.org/linux/man-pages/man2/open.2.html в разделе «Обоснование». Все еще держаться за надлежащее * при поддержке inotify. –

 Смежные вопросы

  • Нет связанных вопросов^_^