Вы неправильно подходите к проблеме.Вы хотите, чтобы файлы не изменялись под вами, пока вы читаете, и не можете сделать это без поддержки операционной системы.Лучшее, на что вы можете надеяться в многопользовательской системе, - это поддерживать согласованность метаданных архива.
Например, если вы создаете каталог архива, убедитесь, что количество байтов, хранящихся в архиве, соответствует каталогу.Вы можете проверить контрольную сумму содержимого файла до и после чтения файловой системы и сравнить ее с тем, что вы записали в архив, и, возможно, пометить ее как «несогласованную».
Что вы пытаетесь выполнить?
Добавлено в ответ на комментарий:
Посмотрите на logrotate
, чтобы украсть идеи о том, как справиться с этим последовательно, просто сделайте это за вас.Если вы обеспокоены тем, что переименование файлов приведет к тому, что процессы, которые в настоящее время их записывают, будут ломать вещи, взгляните на man 2 rename
:
rename () переименовывает файл, перемещая его между каталогами, если это необходимо,Любые другие жесткие ссылки на файл (созданные с помощью ссылки (2)) не затрагиваются.Открытые файловые дескрипторы для oldpath также не затрагиваются.
Если newpath уже существует, он будет атомарно заменен (при соблюдении нескольких условий; см. ОШИБКИ ниже), так что нет точки, в которой другой процесс пытается получить доступ к newpathнайдет его пропавшим без вести.