Следите за новостями GitVerse в нашем телеграм-канале

FileActionsCPP

0

Описание

Инкапсуляция эксклюзивной и общей блокировки файла при чтении/записи из нескольких потоков или процессов

Языки

C++

Сообщить о нарушении
3 месяца назад
4 месяца назад
4 месяца назад
readme.md

Класс для работы с файлом

Производит потокобезопасные операции с файлом. Обеспечивает безопасный доступ к файлу из разных процессов.

Концепция:

  • Основная задача - инкапсуляция эксклюзивной и общей блокировки файла при чтении/записи из нескольких потоков или процессов.
  • Блокировка файла осуществляется функцией flock().

Методы:

  • Один экземпляр класса - один файл. Для каждого файла надо создавать новый экземпляр.
  • При создании экземпляра класса файл открывается с заданными значениями флагов чтения записи. Создается новый файл если он отсутствует. Дескриптор файла остается открытым на все время существования экземпляра класса.
  • При чтении, записи, блокировке не нужно открывать файл или контролировать его дескриптор.
  • Если файл открыт для чтения, то нельзя в него вести запись.
  • Класс содержит стандартные методы чтения, записи, блокировки. А так же ряд методов управления доступом к файлу.

Примеры

sample.cpp

#include "File.h"
#include <thread>
#include <chrono>
int main()
{
File f("test.txt", File::open_mode::rw); // создаем экземпляр класса, файл будет создан если не существует
f.setPerms(0644); // меняем права доступа к файлу
std::cout << "Блокируем файл и записываем в него данные" << std::endl;
std::cout << "Запустите sample.php" << std::endl;
f.lock_ex(); // получаем эксклюзивную блокировку файла
std::string text = "Файл заблокирован в приложении C++";
f.fwrite(text); // записываем данные в файл
std::this_thread::sleep_for(std::chrono::seconds(30)); // имитируем долгий процесс записи
// до истечения времени задержки запустите sample.php и он будет ждать когда файл test.txt будет разблокирован
f.unlock(); // после выполнения этого метода sample.php продолжит свою работу
return 0;
}

sample.php

<?php
/*
Пример получения разделяемой блокировки на файл,
который используется другим процессом
1. Скомпилируйте sample.cpp и запустите его.
2. Запустите этот скрипт, пока процесс из sample.cpp удерживает эксклюзивную блокировку.
*/
$fname = __DIR__ . '/test.txt';
echo "Читаем файл $fname... \n";
$locked_file = fopen($fname, 'r');
flock($locked_file, LOCK_SH);
echo fread($locked_file, filesize($fname)) . "\n"; // эта строчка будет выполнена как только sample.cpp снимет блокировку
fclose($locked_file);

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.