9

inotify を使用してローカル ファイルを監視しています。たとえば、"/root/temp" を使用しています。

inotify_add_watch(fd, "/root/temp", mask).

このファイルを削除すると、プログラムはread(fd, buf, bufSize)機能によってブロックされます。新しい「/root/temp」ファイルを作成しても、プログラムは読み取り機能によってブロックされたままです。監視対象のファイルが作成されたことをinotifyが検出でき、読み取り機能がfdから何かを取得して、読み取りが永久にブロックされないようにすることができるかどうか疑問に思っています。これが私のコードです:

uint32_t mask = IN_ALL_EVENTS;
int fd = inotify_init();
int wd = inotify_add_watch(fd, "/root/temp", mask);
char *buf = new char[1000];
int nbytes = read(fd, buf, 500);

私はすべてのイベントを監視しました。

4

2 に答える 2

22

問題は、readデフォルトでブロック操作であるということです。

ブロックしたくない場合は、selectまたはそのpoll前に使用してくださいread。例えば:

struct pollfd pfd = { fd, POLLIN, 0 };
int ret = poll(&pfd, 1, 50);  // timeout of 50ms
if (ret < 0) {
    fprintf(stderr, "poll failed: %s\n", strerror(errno));
} else if (ret == 0) {
    // Timeout with no events, move on.
} else {
    // Process the new event.
    struct inotify_event event;
    int nbytes = read(fd, &event, sizeof(event));
    // Do what you need...
}

:テストされていないコード。

于 2011-01-12T03:07:26.577 に答える
3

作成された新しいファイルを確認するには、ファイルではなくディレクトリを監視する必要があります。ファイルを監視すると、ファイルが削除されたとき (IN_DELETE_SELF) が表示されますが、同じ名前で新しいファイルが作成された場合は検出されない場合があります。

おそらく IN_CREATE | ディレクトリを監視する必要があります。IN_MOVED_TO を使用して、新しく作成されたファイル (または別の場所から移動されたファイル) を表示します。

一部のエディターやその他のツール (rsync など) は、別の名前でファイルを作成し、名前を変更する場合があります。

于 2011-01-12T08:04:46.080 に答える