FileActionsCPP
Описание
Инкапсуляция эксклюзивной и общей блокировки файла при чтении/записи из нескольких потоков или процессов
Языки
C++
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);