2017-02-08 1 views
1

inotify_add_watch에 전화를 걸어 파일을 봅니다. O_PATH에 상대적인 파일을 지정하고 싶습니다. | O_DIRECTORY 파일 설명자, la symlinkat, fstatat 또는 openat.O_PATH에 상대적인 inotify_add_watch dirfd

이것이 가능합니까? 그것은 그 것처럼 보이지 않습니다. 누구나 해결 방법을 알고 있습니까?

EDIT 가장 가까운 것은 "openat에 대한 이론적 근거"에 man 2 open에 설명 된 "트릭"것으로 보인다

. 예제는 user1643723의 대답을 참조하십시오.

+0

(ab) procfs를 사용해 보셨나요? XXXat 시스템 콜의 기능을 에뮬레이션하려면'/ proc/self/fd/

/filename'을 시도해 보는 것이 좋습니다. – user1643723

+0

/proc/self/fd/6/foo와 같은 경로를 inotify_add_watch에 전달할 때 ENOTDIR을 얻습니다. –

+0

코드에 어떤 종류의 오류가 있습니다. 디렉터리 기술자를 너무 일찍 종료하거나 올바른 설명자를 사용하지 않는 경우 작동 코드에 대한 내 대답을 참조하십시오. – user1643723

답변

0

procfs에서 제공되는 심볼릭 링크를 사용하여 *의 기능을 호출에서 사용할 수 있습니다. 디렉토리 기술자를 열고 파일 이름의 전체 경로 대신 /proc/self/fd/<dir descriptor>/filename를 사용 : 리눅스 4.4.x.에 인쇄 "확인"위

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

프로그램

+0

O_PATH를 사용하지 않았습니다. 나는 또한이 파일 기술자를 syscalls (fstatat 등)의 적절한 *에 전달할 수 있어야한다. –

+0

죄송합니다. O_PATH를 사용하도록 코드를 업데이트했습니다. 아직도 나를 위해 잘 작동합니다. ** 당신이 * ** syscalls에서 O_PATH를 사용하도록 ** 가지고 있지 않다는 것을 기억하십시오 - 그들은 정상적인 파일 기술자로 찾을 수 있습니다. – user1643723

+0

이것이 이론적 근거 인 http://man7.org/linux/man-pages/man2/open.2.html에 설명 된 "트릭"이라고 생각합니다. inotify에 대한 지원에서 적절한 *을 위해 여전히 밖으로 나가십시오. –