2012-04-01 3 views
1

Я написал программу на C, которая опросит каталог для файла, но иногда я получаю сообщение об ошибке при попытке доступа к файлу. Мне было интересно, нужно ли мне дождаться завершения копирования или чего-то еще, прежде чем пытаться его использовать? Я создал цикл, чтобы не загружать файл изображения, пока функция больше не возвращенного нуль:Опрос dir для нового файла в linux с C - Как только он появится, мне нужно подождать, пока он не будет готов к использованию?

while ( (image = SDL_LoadBMP(path)) == NULL ) 
    printf("image = NULL\n"); 

и в конце концов он уже не нулевой. Каков правильный способ справиться с этим?

+0

Попробуйте положить 'usleep' в цикле также – Shahbaz

ответ

2

На самом деле это довольно сложно сделать, особенно, чтобы сделать это надежно. Более или менее невозможно сделать это эффективно.

Самый простой способ решить проблему - запустить fuser из вашей программы C, чтобы определить, открыт ли какой-либо процесс.

И, наконец, обратите внимание, что если у вас есть цикл, ожидающий чего-то, он должен ждать между повторами, чтобы избежать потерь ресурсов вычислений. В конце концов, представьте себе, какие компьютеры будут выглядеть, если каждая программа, в системе, занялась циклом занятости.

EDIT: если вы управляете приложением, создающим файлы, решение, предлагаемое wildplasser @, является лучшим.

+0

Выполняет системный вызов фьюзера лучше, чем использование цикла, как я сделал, хотя, предполагая, что я включаю наноселек? Нет ли способа обнаружить, когда файл закончил копирование? Скажем, например, с файлом AVI, есть ли последовательность байтов, которую я мог бы искать, это подразумевает, что все это есть? – linitbuff

5

Лучший способ справиться с этим - сохранить файл te в «невидимом» каталоге во время его создания. И переместите его в каталог спула после его закрытия. (rename() является атомарным).

Это, конечно, предполагает некоторое сотрудничество с процессом, который фактически создает файлы.

BTW: здесь я принимаю UNIX. Возможно, на других платформах могут быть использованы аналогичные методы. (изменение атрибутов файла видимости/удобочитаемости, вместо переименования/перемещения)

+0

Хороший ответ; если у вас есть контроль над приложением, создающим файлы, это лучшее решение. –

+0

Спасибо, но это камера, производящая файлы, и поэтому я не имею никакого контроля. – linitbuff

+0

Камера записывает файлы в вашу файловую систему, а ваша программа - * не * часть камеры? – wildplasser