hello-world-cpp/task_3/counter_manager.cpp
2025-01-13 19:59:39 +10:00

103 lines
2.7 KiB
C++

#include "counter_manager.h"
long long int CounterManager::get_counter() {
char data_from_file[128];
int num_bytes = 128;
int fd = open(
"counter.txt",
O_RDONLY,
0777
);
if (fd == -1) {
return 0; // Ошибка при открытии файла
}
read(fd, data_from_file, num_bytes);
close(fd);
return atoi(data_from_file);
}
int CounterManager::set_counter(long long int new_counter) {
long long int current_timestamp = MyTime::get_timestamp(), foreign_timestamp;
std::string queue_directory = "queue";
std::string queue_member = std::to_string(current_timestamp) + "_" + std::to_string(getpid()) + ".txt";
std::string queue_member_path = queue_directory + "/" + queue_member;
std::string filename, temp_str;
int queue_member_fd = open(queue_member_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0777);
if (queue_member_fd == -1) { // Если ошибка при открытии
std::cerr << "queue member can't be created" << std::endl;
return -1;
}
close(queue_member_fd);
// std::cout << queue_member << " created" << "\n";
bool start_operation = 0;
DIR* dir;
struct dirent* entry;
while (!start_operation) {
usleep((useconds_t)(100 * 1000));
// std::cout << queue_member << " wait" << "\n";
dir = opendir(queue_directory.c_str());
start_operation = 1;
while ((entry = readdir(dir)) != nullptr) {
// Исключаем "." и ".."
filename = std::string(entry->d_name);
if (filename == "." || filename == "..") {
continue;
}
// std::cout << queue_member << " file prev: " << filename << "\n";
temp_str = "";
for (char sym : filename) {
if (sym == '_') {
break;
}
temp_str += sym;
}
foreign_timestamp = atoll(temp_str.c_str());
if (foreign_timestamp < current_timestamp) {
start_operation = 0;
break;
}
}
}
std::string new_counter_string = std::to_string(new_counter);
int fd = open(
"counter.txt",
O_WRONLY|O_TRUNC|O_APPEND|O_CREAT,
0777
);
if (fd == -1) {
return -1; // Ошибка при открытии файла
}
write(fd, new_counter_string.c_str(), new_counter_string.length());
close(fd);
int status = remove(queue_member_path.c_str());
if (status != 0) {
perror("Error deleting file");
}
// std::cout << queue_member << " deleted" << "\n";
return 0;
}