2011-01-12 18 views
1

inotifyを使用しているときに何らかの問題が発生しました。 私はinotifyを使ってファイルの変更を監視します。ここに私のコードは次のとおりです。inotifyは、ファイルが削除され、再度作成されたときにファイルの監視を停止します。

int fd = inotify_init(); 
int wd = inotify_add_watch(fd, "/root/temp", IN_ALL_EVENTS); 
int bufSize = 1000; 
char *buf = new char[bufSize]; 
memset(buf, 0, sizeof(buf)); 
int nBytes = read(fd, buf, bufSize - 1); 
cout << nBytes << " bytes read" << endl; 
inotify_event *eventPtr = (inotify_event *)buf; 
int offset = 0; 
while (offset < nBytes) 
{ 
    cout << eventPtr->mask << endl; 
    offset += sizeof(inotify_event) + eventPtr->len; 
    eventPtr = (inotify_event *)(buf + offset); 
} 
delete []buf; 

私は「/ルート/ TEMP」を削除して、ファイルを再作成し、このファイルへの変更はinotifyをによって監視されていない場合は、誰でもどのようにこのですか?ありがとう。

チェン

答えて

6

inotifyは、ファイル名ではなく、その下にあるinodeを監視しているからです。そのファイルを削除すると、現在見ているiノードが無効になるため、inotify_rm_watchを呼び出す必要があります。同じ名前で異なるinodeを持つ新しいファイルを監視する場合は、作成時に親フォルダを監視して検出する必要があります。

3

あなたはAPIを使用するたびに、は、本書をお読みください。

inotifyは、ファイル名ではなく、一意のファイル識別子iノードを使用して動作します。 Linuxカーネル全体は実際はinodeで動作します。ファイル名はinodeを調べる手段にすぎません。

希望するものを得るには、/ rootディレクトリを監視する必要があります。ファイルが追加されると、作成イベントがレポートされます。そのファイルの名前が "temp"の場合、そのファイルに時計を追加できます。

4

他の2つの答えは正しいです。もう一つの有用な点は、時計が無効になったときにinotifyがあなたに伝えることです。

mask & IN_IGNORED 

はゼロではありません。

"ウォッチが明示的に削除された(inotify_rm_watch(2))か、自動的に(ファイルが削除されたか、ファイルシステムがマウント解除されました)"というときにIN_IGNOREDが設定されています。

これが設定されていると、ファイル(および/またはファイルがまだ再作成されていない場合はディレクトリ)を再ウォッチすることができます。

関連する問題