3

イベント通知にinotifyサブシステムを使用して、Linux のDでファイル ウォッチャーを作成しています。以下にいくつかのコードを書きましたが、ほぼそこにいますが、監視されているファイルが無視されるように切り替えられ、それ以上のイベントが発生しないという問題があります。

この男が同様の問題を抱えているようですが、そこには答えがありません: Inotify vim の変更

次のコードを検討してください。

/**
 * Imports.
 */
import core.sys.posix.unistd;
import core.sys.posix.sys.select;
import inotify;
import std.stdio;

/**
 * Main.
 */
void main(string[] arguments)
{
    immutable int EVENT_BUF_LEN = (1024 * (inotify_event.sizeof + 16));

    auto inotifyInstance = inotify_init();

    if (inotifyInstance >= 0)
    {
        string watchedFile = "/home/gary/Desktop/test.txt";
        char[EVENT_BUF_LEN] buffer;
        void* pointer;

        auto watchDescriptor = inotify_add_watch(inotifyInstance, cast(char*)watchedFile, IN_ALL_EVENTS);

        while (true)
        {
            fd_set rfds;
            FD_ZERO(&rfds);
            FD_SET(inotifyInstance, &rfds);

            timeval timeout;
            timeout.tv_sec  = 5;
            timeout.tv_usec = 0;

            if (select(FD_SETSIZE, &rfds, null, null, &timeout))
            {
                auto inotifyResult = read(inotifyInstance, buffer.ptr, buffer.length);

                for (pointer = buffer.ptr; pointer < buffer.ptr + inotifyResult; )
                {
                    inotify_event* event = cast(inotify_event*)pointer;

                    if (event.mask & IN_ACCESS)
                    {
                        writeln("IN_ACCESS");
                    }

                    if (event.mask & IN_MODIFY)
                    {
                        writeln("IN_MODIFY");
                    }

                    if (event.mask & IN_ATTRIB)
                    {
                        writeln("IN_ATTRIB");
                    }

                    if (event.mask & IN_CLOSE_WRITE)
                    {
                        writeln("IN_CLOSE_WRITE");
                    }

                    if (event.mask & IN_CLOSE_NOWRITE)
                    {
                        writeln("IN_CLOSE_NOWRITE");
                    }

                    if (event.mask & IN_OPEN)
                    {
                        writeln("IN_OPEN");
                    }

                    if (event.mask & IN_MOVED_FROM)
                    {
                        writeln("IN_MOVED_FROM");
                    }

                    if (event.mask & IN_MOVED_TO)
                    {
                        writeln("IN_MOVED_TO");
                    }

                    if (event.mask & IN_CREATE)
                    {
                        writeln("IN_CREATE");
                    }

                    if (event.mask & IN_DELETE)
                    {
                        writeln("IN_DELETE");
                    }

                    if (event.mask & IN_DELETE_SELF)
                    {
                        writeln("IN_DELETE_SELF");
                    }

                    if (event.mask & IN_MOVE_SELF)
                    {
                        writeln("IN_MOVE_SELF");
                    }

                    if (event.mask & IN_UMOUNT)
                    {
                        writeln("IN_UMOUNT");
                    }

                    if (event.mask & IN_Q_OVERFLOW)
                    {
                        writeln("IN_Q_OVERFLOW");
                    }

                    if (event.mask & IN_IGNORED)
                    {
                        writeln("IN_IGNORED");
                    }

                    if (event.mask & IN_CLOSE)
                    {
                        writeln("IN_CLOSE");
                    }

                    if (event.mask & IN_MOVE)
                    {
                        writeln("IN_MOVE");
                    }

                    if (event.mask & IN_ONLYDIR)
                    {
                        writeln("IN_ONLYDIR");
                    }

                    if (event.mask & IN_DONT_FOLLOW)
                    {
                        writeln("IN_DONT_FOLLOW");
                    }

                    if (event.mask & IN_EXCL_UNLINK)
                    {
                        writeln("IN_EXCL_UNLINK");
                    }

                    if (event.mask & IN_MASK_ADD)
                    {
                        writeln("IN_MASK_ADD");
                    }

                    writefln("wd: %s - mask: 0x%08x - cookie: %s - len: %s", event.wd, event.mask, event.cookie, event.len);

                    pointer += inotify_event.sizeof + event.len;
                }

            }
        }

        inotify_rm_watch(inotifyInstance, watchDescriptor);
        close(inotifyInstance);
    }
}

次のアクションを実行すると、次の結果が得られます。

  1. ~/Desktop/test.txt をタッチ

    IN_OPEN
    wd: 1 - マスク: 0x00000020 - Cookie: 0 - len: 0
    IN_IGNORED
    wd: 1 - マスク: 0x00008000 - Cookie: 0 - len: 0

  2. echo "メアリーは子羊を飼っていました。" >> ~/デスクトップ/test.txt

    IN_OPEN
    wd: 1 - マスク: 0x00000020 - Cookie: 0 - len: 0
    IN_IGNORED
    wd: 1 - マスク: 0x00008000 - Cookie: 0 - len: 0

  3. Vim で開き、変更して :wq

    IN_OPEN
    wd: 1 - マスク: 0x00000020 - Cookie: 0 - len: 0
    IN_IGNORED
    wd: 1 - マスク: 0x00008000 - Cookie: 0 - len: 0

ここでは何も機能していないようで、open イベントがトリガーされた後、ファイルは無視されます。

コードを変更してIN_ALL_EVENTSフラグ (すべてのイベントをチェックする) を変更してIN_MODIFY代わりに使用すると、次のようになります。

  1. ~/Desktop/test.txt をタッチ

    検索結果はありません。

  2. echo "メアリーは子羊を飼っていました。" >> ~/デスクトップ/test.txt

    IN_MODIFY wd: 1 - マスク: 0x00000002 - Cookie: 0 - len: 0

  3. Vim で開き、変更して :wq

    IN_IGNORED wd: 1 - マスク: 0x00008000 - Cookie: 0 - len: 0

ポイント2のみが正しく機能しているようです。

ここで私が間違っていることと、コードを変更してファイルのすべての変更イベントを正しく取得することについての考えはありますか?

4

1 に答える 1