C: flock(); windows, mingw. - C (СИ)

Узнай цену своей работы

Формулировка задачи:

собственно САБЖ. Хочется получить что-то вроде
//linux:
    flock(file,LOCK_EX);
    sleep(20);
    fprintf(file,"tratata");
    flock(file,LOCK_UN);
используя mingw под windows. Тоечнее: мне нужно блокировать доступ к фаилу на время дозаписи для родственных процессов.

Решение задачи: «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);
}

Объяснение кода листинга программы

Объяснение кода:

  1. *FILE f = NULL;** В этой строке объявляется указатель на файл. Пока что он равен NULL, то есть указывает на то, что файл еще не открыт.
  2. int fd = 0; Здесь объявляется целочисленная переменная, которая будет использоваться как дескриптор файла в операционной системе.
  3. HANDLE hFile; Это переменная типа HANDLE, которая будет использоваться для работы с файлом в операционной системе Windows.
  4. void f_init(){ Это функция, которая инициализирует файловый поток.
  5. hFile = CreateFile( В этой строке функция CreateFile() используется для создания или открытия файла. Переданные параметры описывают, какой файл нужно открыть или создать, какие права доступа нужны и какие параметры файла должны быть.
  6. assert( !(hFile == INVALID_HANDLE_VALUE) ); Здесь используется функция assert() для проверки, что файл был успешно открыт. Если файл не удалось открыть, то hFile будет равен INVALID_HANDLE_VALUE.
  7. fd = _open_osfhandle((long)hFile,0); В этой строке дескриптор файла привязывается к файловому потоку.
  8. assert(fd); Здесь снова используется функция assert() для проверки, что файловый поток был успешно создан.
  9. f = _fdopen(fd, a+); Здесь файловый поток привязывается к файлу.
  10. assert(f); Еще одна проверка, что файл был успешно открыт.
  11. fseek(f, 0L, SEEK_END); В этой строке файл перемещается в конец, чтобы можно было сразу начать запись. Это основная логика кода. Остальные строки - это вспомогательные вызовы функций для обработки ошибок и работы с файлами.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5