C: flock(); windows, mingw. - C (СИ)
Формулировка задачи:
собственно САБЖ.
Хочется получить что-то вроде
используя mingw под windows.
Тоечнее: мне нужно блокировать доступ к фаилу на время дозаписи для родственных процессов.
//linux:
flock(file,LOCK_EX);
sleep(20);
fprintf(file,"tratata");
flock(file,LOCK_UN);Решение задачи: «C: flock(); windows, mingw.»
textual
Листинг программы
FILE* f = NULL;
int fd = 0;
HANDLE hFile;
void f_init(){
hFile = CreateFile(
fname, // имя файла
GENERIC_WRITE, // доступ к фаилу
FILE_SHARE_WRITE, // совместный доступ к файлу
NULL, // защиты нет
OPEN_ALWAYS, // откроем или создадим
FILE_ATTRIBUTE_NORMAL, // обычный фаил
NULL // шаблона нет
);
assert( !(hFile == INVALID_HANDLE_VALUE) );
// привязываем поток:
fd = _open_osfhandle((long)hFile,0);
assert(fd);
f = _fdopen(fd, "a+");
assert(f);
fseek(f, 0L, SEEK_END);
}
Объяснение кода листинга программы
Объяснение кода:
- *FILE f = NULL;** В этой строке объявляется указатель на файл. Пока что он равен NULL, то есть указывает на то, что файл еще не открыт.
- int fd = 0; Здесь объявляется целочисленная переменная, которая будет использоваться как дескриптор файла в операционной системе.
- HANDLE hFile; Это переменная типа HANDLE, которая будет использоваться для работы с файлом в операционной системе Windows.
- void f_init(){ Это функция, которая инициализирует файловый поток.
- hFile = CreateFile( В этой строке функция CreateFile() используется для создания или открытия файла. Переданные параметры описывают, какой файл нужно открыть или создать, какие права доступа нужны и какие параметры файла должны быть.
- assert( !(hFile == INVALID_HANDLE_VALUE) ); Здесь используется функция assert() для проверки, что файл был успешно открыт. Если файл не удалось открыть, то hFile будет равен INVALID_HANDLE_VALUE.
- fd = _open_osfhandle((long)hFile,0); В этой строке дескриптор файла привязывается к файловому потоку.
- assert(fd); Здесь снова используется функция assert() для проверки, что файловый поток был успешно создан.
- f = _fdopen(fd,
a+); Здесь файловый поток привязывается к файлу. - assert(f); Еще одна проверка, что файл был успешно открыт.
- fseek(f, 0L, SEEK_END); В этой строке файл перемещается в конец, чтобы можно было сразу начать запись. Это основная логика кода. Остальные строки - это вспомогательные вызовы функций для обработки ошибок и работы с файлами.