2017-02-08 3 views
1

inotify_add_watchに電話してファイルを見ようとしています。 O_PATHに相対的なファイルを指定したい| O_DIRECTORYファイル記述子、aa symlinkatfstatat、またはopenatです。O_PATHを基準にしたinotify_add_watch dirfd

これは可能ですか?それはそうではありません。誰でも回避策を知っていますか?

EDIT

最も近いものは「openatの根拠」の下man 2 openで説明した「トリック」のようです。例については、user1643723の回答を参照してください。

+0

procfsを使って(ab)試しましたか? XXXtシステムコールの機能をエミュレートする場合は、 '/ proc/self/fd/

/filename'を試してみることをお勧めします。 – user1643723

+0

/proc/self/fd/6/fooのようなパスをinotify_add_watchに渡すと、ENOTDIRを取得します –

+0

コードに何らかのエラーがあります。ディレクトリ記述子をあまりに早く閉じるか、最初に正しい記述子を使用していないかのいずれかです。作業コードの私の答えを見てください。 – user1643723

答えて

0

procfsによって提供されるシンボリックリンクを使用して、*の機能をで呼び出すことができます。 Linuxの4.4.x.で「OK」

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

プリント上記のプログラムを:ディレクトリ記述子を開き、ファイル名へのフルパスではなく/proc/self/fd/<dir descriptor>/filenameを使用

+0

O_PATHは使用していません。私はまた、このファイル記述子をsyscalls(fstatatなど)の適切な*に渡せるようにする必要があります。 –

+0

申し訳ありませんが、O_PATHを使用するようにコードを更新しました。まだ私のためにうまくいく。注意してください。**は、syscallsで*とO_PATHを使用する**がありません。通常のファイル記述子で検索するだけです。 – user1643723

+0

これは、根拠の下でhttp://man7.org/linux/man-pages/man2/open.2.htmlに記載されている "トリック"だと思います。 inotifyのサポートで適切な*のためにまだ持ちこたえています。 –

関連する問題