Мониторинг файла с использованием inotify - PullRequest
6 голосов
/ 12 января 2011

Я использую 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);

Я следил за всеми событиями.

Ответы [ 2 ]

19 голосов
/ 12 января 2011

Проблема в том, что 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...
}

Примечание : непроверенный код.

3 голосов
/ 12 января 2011

Чтобы увидеть созданный новый файл, вам нужно посмотреть каталог, а не файл.При просмотре файла должно быть видно, когда он был удален (IN_DELETE_SELF), но он может не определить, создан ли новый файл с тем же именем.

Вероятно, вам следует посмотреть каталог IN_CREATE |IN_MOVED_TO для просмотра вновь созданных файлов (или файлов, перемещенных из другого места).

Некоторые редакторы и другие инструменты (например, rsync) могут создавать файл под другим именем, а затем переименовывать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...