select всегда возвращает ненулевое значение при использовании с inotify - PullRequest
0 голосов
/ 11 апреля 2020

Верхняя часть кода не может работать,

, потому что после того, как отслеживаемый mPath был изменен один раз

, select () никогда не заблокируется, даже когда я покинул подпрограмму "reload ()" пусто.

однако нижняя работает нормально

как это исправить? спасибо

    int fd = inotify_init();
    if (fd < 0) {
        return;
    }

    int wd = inotify_add_watch(fd, mPath, IN_MODIFY | IN_DELETE);
    while (1) {
#if 0 // FIXME select always return 1 after change once
            fd_set fdr;
            fd_set fdw;
            FD_ZERO(&fdr);
            FD_ZERO(&fdw);
            FD_SET(fd, &fdr);
            FD_SET(fd, &fdw);
            int result = select(fd + 1, &fdr, NULL, NULL, NULL);
            if (result == 1 && FD_ISSET(fd, &fdr)) {
                  reload();
            }

#else
            char buf[4096];
            read(fd, buf, sizeof(buf));
            reload();
#endif
    }

    inotify_rm_watch(fd, wd);
    close(fd);
...