lockfileex не останавливает create_always от стирания файла - PullRequest
2 голосов
/ 19 ноября 2011

в одном процессе я вызвал createfile с GENERIC_READ |GENERIC_WRITE, FILE_SHARE_READ |FILE_SHARE_WRITE, OPEN_ALWAYS и FILE_ATTRIBUTE_NORMAL в качестве параметров.Затем я вызвал LockFileEx на весь файл.я получил эксклюзивную блокировку и заблокировал ее в диапазоне от 0 до UINT_MAX.

, после чего в другом процессе я вызвал :: CreateFileW (path.c_str (), perms, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRUT, НОЛЬ);

, и это стерло содержимое файла.разве это не должно быть в состоянии сделать это, в то время как моя другая prcoess заблокировала файл (исключительно)?

Я хочу, чтобы другие процессы могли получать указатели на файл (именно поэтому я использовал флаги file_share), но я предположил, что они вообще не могли изменить файл, пока другой процесс заблокировал его, и поэтому я делал что-то вроде

createfile lockfileex

и блокировал его на lockfileex до тех пор, пока не освободится другой файлзамок.это только у меня так или здесь не так поведение msft?

1 Ответ

3 голосов
/ 19 ноября 2011

Это спорно, является ли Windows должен замков честь файл при попытке открыть файл с CREATE_ALWAYS, но это видно из ваших заметок, что это не так.Лучший способ предотвратить запись других процессов в файл, который вы открыли, - не указывать FILE_SHARE_WRITE в вашем эксклюзивном процессе.

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

Если у вас есть доступ к источнику всехвовлеченные процессы, тогда вы могли бы просто иметь процессы, которые пытаются обрезать файл, сначала вызвать LockFileEx для региона, а затем вызвать SetFileSize после получения блокировки.

В качестве примечания, блокировка области только от 0байты в UINT_MAX не обеспечат взаимное исключение, если, скажем, процесс открывает файл и пытается записать в местоположение в UINT_MAX + 1 (сразу после точки 4 ГБ).

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