0

次のコードを使用して、通知を使用してファイルを監視します。最初にポーリングしてから、ブロックを防ぐための変更があるかどうかを読み取ります。

int settingsCheck(int &length, int &i, char * buffer, int &fd, string setRead[])
{
    int f_change = 0;

    struct pollfd pfd = { fd, POLLIN, 0 };
    /* Poll with a timeout of 100ms */
    int ret = poll(&pfd, 1, 100);
    /* Check to see the result of the poll */
    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;
        length = read(fd, buffer, BUF_LEN);
        printf("read\n");

        while (i < length)
        {
            struct inotify_event *event = (struct inotify_event *) &buffer[i];
            if (event->len)
            {
                if (event->mask & IN_MODIFY && event->name == "setitngs.txt")
                {
                    printf("The file %s was modified.\n", event->name);
                    //f_change = 1;
                }
                else if(event->mask & IN_MODIFY)
                {
                    printf("Not settings\n");
                }
            }
            i += EVENT_SIZE + event->len;
        }
        readSettings(setRead);
        return 1;
    }

    return 0;
}

監視対象のテキスト ファイル (php スクリプトで変更) を変更すると、プログラムはファイルを複数回 (2 ~ 4 回) 読み取り、最後の読み取りで正しいデータのみを読み取ることがあります。

なぜこれが起こるのか/それを修正する方法を知っている人はいますか?

PS:次の場合に readSettings() 関数を呼び出すと、私は正しいと言っています。

if (event->mask & IN_MODIFY && event->name == "setitngs.txt")

次に、「settings.txt」が監視されているときにreadSettings()を1回だけ呼び出す必要がありますか?

4

0 に答える 0