Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Дождаться появления файла


Автор: CPlusPlusFAN 16.11.2008, 20:32
Здравствуйте!

Процессу необходимо дождаться появления файла ( test.txt ), который создаётся, к примеру, параллельным процессом. Причём дождаться не куска файла, а полного ( чтобы его можно было открыть ). Можно бы в цикле пытаться открывать файл. А есть ли вариант получше? ( средствами АПИ, например )

Спасибо за внимание.

Автор: Rififi 16.11.2008, 21:49
ReadDirectoryChangesW
фигню сморозил, отвечал по rss, там не видно разделов :gigi:

Автор: MAKCim 16.11.2008, 22:20
CPlusPlusFAN, 
man inotify

1. ждем создание файла в директории через (IN_CREATE)
2. ждем пока он не будет закрыт процессом после записи (IN_CLOSE_WRITE)

Код

char buf[PATH_MAX];
struct inotify_event event;
int inotify_fd = inotify_init();
if (inotify_fd < 0) {
    /* error */
}
int fd = inotify_add_watch(inotify_fd, DIRECTORY_PATH, IN_CREATE | IN_ONESHOT);
if (fd < 0) {
    /* error */
}
do {
    if (read(fd, &event, sizeof(event) < 0) {
        /* error */
    }
    if (memmem(event.name, event.len, "test.txt", 8) == NULL)
        continue;
    break;
} while (1);
inotify_rm_watch(inotify_fd, fd);
snprintf(buf, PATH_MAX, "%s/%s", DIRECTORY_PATH, event.name);
if ((fd = inotify_add_watch(inotify_fd, buf, IN_CLOSE_WRITE | IN_ONESHOT)) < 0) {
    /* error */
}
...

Автор: CPlusPlusFAN 16.11.2008, 22:45
MAKCim, хорошо. А если к моменту регистрации события IN_CREATE файл уже был создан?

Автор: CPlusPlusFAN 16.11.2008, 23:19
Если файл не был закрыт процессом?
Если файл сбрасывался flush'ем на диск, тогда событие регистрируется?

Автор: MAKCim 17.11.2008, 09:08
Цитата(CPlusPlusFAN @  16.11.2008,  22:45 Найти цитируемый пост)
А если к моменту регистрации события IN_CREATE файл уже был создан?

ну не ждать тогда события IN_CREATE  smile 


Цитата(CPlusPlusFAN @  16.11.2008,  23:19 Найти цитируемый пост)
Если файл сбрасывался flush'ем на диск, тогда событие регистрируется? 

fflush() - это обычный write
в процессе записи генерируются события IN_ACCESS, IN_ATTRIB, IN_MODIFY

сам подумай, как можно узнать, что с файлом больше не будут работать, если он не закрывается?
только эвристикой
и это будет не 100%

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)