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

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

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

 chmike28 сент. 2016 г., 18:18
Чтобы обнаружить создание файла, вам нужно посмотреть каталог, содержащий файл.

Ответы на вопрос(2)

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

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

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

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...
}

Запись: непроверенный код.

 jweyrich12 янв. 2011 г., 05:23
@ user572138: Я рад, что это помогло. Я призываю вас прочитать осистема репутации вВопросы-Ответы, если вы еще не сделали.
 user57213812 янв. 2011 г., 04:35
Если я использую select или poll, нужно ли мне периодически проверять файл, например, пока (true) {select (...); спать();}? Я хочу, чтобы изменения в файле были переданы мне. Если никаких изменений не происходит, программа блокируется как функция чтения.
 jweyrich12 янв. 2011 г., 04:45
@ user572138: предоставленный мною фрагмент делает: 1) Ожидание нового события в течение 50 мс; 2) Если за это время не получено ни одного события, оно ничего не делает; 3) Если получено новое событие, оно читает событие; - Чтобы получить поведение, которое вы описали, вам просто нужно обернуть его в цикл, как вы упомянули.
 user57213812 янв. 2011 г., 04:46
Возможно, я неправильно понял ваш первый пост, теперь я понимаю, что вы имеете в виду. Я думаю, что это хорошее решение, спасибо.

Ваш ответ на вопрос