add queue
This commit is contained in:
parent
b20ce7c4de
commit
be84bd1735
@ -3,10 +3,11 @@ cmake_minimum_required(VERSION 3.13)
|
||||
project(hello-world-cpp-logger)
|
||||
|
||||
|
||||
add_library(my_time STATIC my_time.cpp)
|
||||
add_library(log_writer STATIC log_writer.cpp)
|
||||
add_library(process_launcher STATIC process_launcher.cpp)
|
||||
add_library(counter_manager STATIC counter_manager.cpp)
|
||||
|
||||
add_executable(main main.cpp)
|
||||
|
||||
target_link_libraries(main log_writer process_launcher counter_manager)
|
||||
target_link_libraries(main my_time log_writer process_launcher counter_manager)
|
@ -1 +1 @@
|
||||
28
|
||||
107
|
@ -2,6 +2,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
long long int CounterManager::get_counter() {
|
||||
char data_from_file[128];
|
||||
int num_bytes = 128;
|
||||
@ -24,6 +27,57 @@ long long int CounterManager::get_counter() {
|
||||
|
||||
|
||||
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",
|
||||
@ -37,5 +91,13 @@ int CounterManager::set_counter(long long int new_counter) {
|
||||
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;
|
||||
}
|
@ -1,7 +1,13 @@
|
||||
#include "my_time.h"
|
||||
|
||||
#include <string>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <dirent.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
||||
class CounterManager {
|
||||
public:
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "log_writer.h"
|
||||
|
||||
|
||||
int LogWriter::write_log(const std::string& log_line) {
|
||||
std::string new_line = "\n";
|
||||
int fd = open(
|
||||
@ -20,23 +21,12 @@ int LogWriter::write_log(const std::string& log_line) {
|
||||
}
|
||||
|
||||
|
||||
std::string LogWriter::get_current_time() {
|
||||
time_t rawtime;
|
||||
struct tm * timeinfo;
|
||||
time ( &rawtime );
|
||||
timeinfo = localtime ( &rawtime );
|
||||
std::string res = asctime (timeinfo);
|
||||
res.pop_back();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
void LogWriter::log_start_line(){
|
||||
std::string log_line = (
|
||||
"start programm with pid " +
|
||||
std::to_string(getpid()) +
|
||||
" at " +
|
||||
get_current_time()
|
||||
MyTime::get_current_time()
|
||||
);
|
||||
write_log(log_line);
|
||||
}
|
||||
@ -45,7 +35,7 @@ void LogWriter::log_start_line(){
|
||||
void LogWriter::log_counter(long long int counter){
|
||||
std::string log_line = (
|
||||
"counter at " +
|
||||
get_current_time() +
|
||||
MyTime::get_current_time() +
|
||||
" in process with pid " +
|
||||
std::to_string(getpid()) +
|
||||
" is " +
|
||||
@ -59,7 +49,7 @@ void LogWriter::log_copy_start(std::string copy_name) {
|
||||
std::string log_line = (
|
||||
copy_name +
|
||||
" is started at " +
|
||||
get_current_time() +
|
||||
MyTime::get_current_time() +
|
||||
" with pid " +
|
||||
std::to_string(getpid())
|
||||
);
|
||||
@ -70,7 +60,7 @@ void LogWriter::log_copy_finish(std::string copy_name) {
|
||||
std::string log_line = (
|
||||
copy_name +
|
||||
" is finished at " +
|
||||
get_current_time()
|
||||
MyTime::get_current_time()
|
||||
);
|
||||
write_log(log_line);
|
||||
}
|
||||
|
@ -1,7 +1,9 @@
|
||||
#include "my_time.h"
|
||||
|
||||
#include <string>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
|
||||
class LogWriter {
|
||||
@ -12,9 +14,6 @@ public:
|
||||
static void log_copy_finish(std::string copy_name);
|
||||
static void log_copy_error(std::string copy_name);
|
||||
|
||||
protected:
|
||||
static std::string get_current_time();
|
||||
|
||||
private:
|
||||
static int write_log(const std::string& log_line);
|
||||
|
||||
|
@ -2,7 +2,9 @@
|
||||
#include "log_writer.h"
|
||||
#include "counter_manager.h"
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <iostream>
|
||||
|
||||
|
||||
|
||||
struct two_pid {
|
||||
@ -32,13 +34,6 @@ struct two_pid {
|
||||
#endif
|
||||
|
||||
|
||||
long long int get_timestamp_ms() {
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
|
||||
return (((long long int)tv.tv_sec)*1000)+(tv.tv_usec/1000);
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc >= 2) {
|
||||
@ -59,17 +54,38 @@ int main(int argc, char* argv[]) {
|
||||
}
|
||||
}
|
||||
|
||||
// create dir if it doesn't exist
|
||||
struct stat info;
|
||||
std::string dirpath = "queue";
|
||||
if (!(stat(dirpath.c_str(), &info) == 0 && (info.st_mode & S_IFDIR))) {
|
||||
mkdir(dirpath.c_str()) == 0;
|
||||
}
|
||||
|
||||
|
||||
DIR* dir;
|
||||
struct dirent* entry;
|
||||
std::string filename_temp;
|
||||
dir = opendir(dirpath.c_str());
|
||||
while ((entry = readdir(dir)) != nullptr) {
|
||||
// Исключаем "." и ".."
|
||||
filename_temp = std::string(entry->d_name);
|
||||
if (filename_temp == "." || filename_temp == "..") {
|
||||
continue;
|
||||
}
|
||||
remove((dirpath + "\\" + filename_temp).c_str());
|
||||
}
|
||||
|
||||
LogWriter::log_start_line();
|
||||
|
||||
struct two_pid pid_of_copy_processes;
|
||||
|
||||
long long int last_counter_increment = get_timestamp_ms();
|
||||
long long int last_counter_logging = get_timestamp_ms();
|
||||
long long int last_copies_launching = get_timestamp_ms();
|
||||
long long int last_counter_increment = MyTime::get_timestamp();
|
||||
long long int last_counter_logging = MyTime::get_timestamp();
|
||||
long long int last_copies_launching = MyTime::get_timestamp();
|
||||
long long int current_time;
|
||||
|
||||
while (1) {
|
||||
current_time = get_timestamp_ms();
|
||||
current_time = MyTime::get_timestamp();
|
||||
|
||||
if ((current_time - last_counter_increment) >= 300) {
|
||||
last_counter_increment = current_time;
|
||||
|
19
task_3/my_time.cpp
Normal file
19
task_3/my_time.cpp
Normal file
@ -0,0 +1,19 @@
|
||||
#include "my_time.h"
|
||||
|
||||
std::string MyTime::get_current_time() {
|
||||
time_t rawtime;
|
||||
struct tm * timeinfo;
|
||||
time ( &rawtime );
|
||||
timeinfo = localtime ( &rawtime );
|
||||
std::string res = asctime (timeinfo);
|
||||
res.pop_back();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
long long int MyTime::get_timestamp() {
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
|
||||
return (((long long int)tv.tv_sec)*1000)+(tv.tv_usec/1000);
|
||||
}
|
16
task_3/my_time.h
Normal file
16
task_3/my_time.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef MY_TIME_H
|
||||
#define MY_TIME_H
|
||||
|
||||
#include <string>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
|
||||
class MyTime {
|
||||
public:
|
||||
static std::string get_current_time();
|
||||
static long long int get_timestamp();
|
||||
};
|
||||
|
||||
|
||||
#endif // MY_TIME_H
|
0
task_3/queue/1736762345499_18672.txt
Normal file
0
task_3/queue/1736762345499_18672.txt
Normal file
0
task_3/queue/1736762345500_740.txt
Normal file
0
task_3/queue/1736762345500_740.txt
Normal file
Loading…
x
Reference in New Issue
Block a user