-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdaemon.cpp
125 lines (106 loc) · 3.25 KB
/
daemon.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/**
* MASTER MIAGE M1
* Cours Système
* Enseignant : Hendry F. Chame
*/
#include <fstream>
#include <sstream>
#include <string.h>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <unistd.h>
#include <csignal>
#include <stdexcept>
// Variables globales
const std::string dirPrefix = {"sensor/"};
std::string subject;
int my_sId, my_activity, my_index;
// Saugarde l'index d'itération
void setIterationIndex(std::string fname){
std::stringstream ss;
ss << dirPrefix << "/index/" << fname << "_activity"<< my_activity << ".idx";
std::string filename = ss.str();
std::ofstream ofile;
ofile.open(filename);
ofile << my_index;
ofile.close();
}
// Lecture de l'index et activité
void getIterationIndex(std::string fname){
std::stringstream ss;
ss << dirPrefix << "/index/" << fname << "_activity"<< my_activity << ".idx";
std::string filename = ss.str();
// création d’un object ifstream
std::ifstream ifile;
// ouverture du fichier
ifile.open(filename);
if (ifile){
std::string line;
std::getline (ifile, line);
my_index = atoi(line.c_str());
ifile.close();
}
}
// Interception du signal kill et sauvegarde de l'index d'itération
void signal_handler(int signal){
setIterationIndex(subject);
exit(1);
}
// Fonction pour vérifier l'existence d'un fichier
bool fileExists(const std::string& filename) {
std::ifstream file(filename);
return file.good();
}
// Fonction main: itération en boucle des données
int main(int argc, char *argv[]){
try {
my_sId = 0;
my_activity = 0;
my_index = 1;
int refresh_rate = 1000;
subject.append("subject");
// Install a signal handler
std::signal(SIGINT, signal_handler);
if (argc > 3 && argv[0] != "") {
my_sId = atoi(argv[1]);
my_activity = atoi(argv[2]);
refresh_rate = atoi(argv[3]);
}
subject.append(std::to_string(my_sId));
getIterationIndex(subject);
std::stringstream ss;
ss << dirPrefix << "data/" << subject << "_activity" << my_activity << ".csv";
std::string filename = ss.str();
if (!fileExists(filename)) {
throw std::runtime_error("Le fichier de données n'existe pas : " + filename);
}
std::ifstream input(filename);
if (!input.is_open()) {
throw std::runtime_error("Erreur de lecture du fichier : " + filename);
}
std::vector<std::vector<std::string>> csvRows;
int k = 0;
// sauter jusqu'à la ligne de l'index
while (k++ < my_index){
std::string line;
std::getline(input, line);
}
while(true){
std::string line;
while(std::getline(input, line)){
my_index++;
std::cout << line << std::endl;
usleep(refresh_rate * 1000); // dormir pendant refresh_rate ms
}
my_index = 1;
input.clear();
input.seekg (0); // aller à l'index 0
std::getline(input, line);
}
} catch (const std::exception& e) {
std::cerr << "Erreur : " << e.what() << std::endl;
return 1;
}
}