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); В этой строке файл перемещается в конец, чтобы можно было сразу начать запись. Это основная логика кода. Остальные строки - это вспомогательные вызовы функций для обработки ошибок и работы с файлами.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д