consolidate all repos to one for archive

This commit is contained in:
2025-01-28 13:46:42 +01:00
commit a6610fbc7a
5350 changed files with 2705721 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
all: clean streznik odjemalnik
streznik: streznik.cpp
g++ -pthread -lrt streznik.cpp -o streznik
odjemalnik: odjemalnik.cpp
g++ -pthread -lrt odjemalnik.cpp -o odjemalnik
clean:
rm -f odjemalnik streznik vhod izhod izklop

View File

@@ -0,0 +1,21 @@
Nadzornik pomnilnika (samostojna naloga)
Pripravite program nadzornikPomnilnika, ki bo spremljal porabo pomnilnika v sistemu. Program naj deluje kot sistemski servis. Program naj spremlja in beleži trenutno stanje pomnilnika, drugim programom pa preko poljubne medprocesne komunikacije omogoča dostop do meritev in konfiguracijo zajemanja.
Trenutno stanje pomnilnika lahko preberete iz zbirke /proc/meminfo (poiščite meminfo v dokumentaciji man 5 proc za podroben opis vsebine). V njen je zapisanih precej podrobnosti, vaš servis naj spremlja in beleži vsaj:
količino celotnega pomnilnika
količino prostega pomnilnika
količino pomnilnika na voljo procesom
količino celotnega swap prostora
količino prostega swap prostora
Servis ima dva parametra zajemanja: čas med branji in število hranjenih meritev. Čas med branji določa koliko časa sevis počaka med branji /proc/meminfo. Število hranjenih meritev pa določa koliko zadnjih prebranih vrednosti si servis zapomne.
Servis naj preko poljubne tehnike medprocesne komunikacije omogoča komunikacijo z različnimi odjemalci. Odjemalci lahko spreminjajo oba parametra, pridobijo trenutno hranjeno zgodovino in ustavijo servis. Servis mora omogočati komunikacijo z več odjemalci hkrati in ostati odziven. Priporočamo, da uporabite vsaj dve niti. Eno za branje /proc/meminfo in eno ali več za komunikacijo z odjemalci.
Za komunikacijo boste potrebovali en kanal (cev, vrsto za sporočila, itd. ), na katerem se odjemalci povežejo na servis. Za vsakega odjemalca mora nato servis ustvariti nov kanal preko katerega komunicira s tistim odjemalcem.
Pripravite tudi primer odjemalca. Le ta naj omogoča pošiljanje zahtev servisu in izpis vrnjenih vrednosti (na primer zgodovine porabe pomnilnika).
Servis lahko poženete v enem terminalu, odjemalce pa v drugih. Ne rabite pripravljati resničnega sistemskega servisa

View File

@@ -0,0 +1,69 @@
#include <pthread.h>
#include <sys/sysinfo.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <list>
#include <cstring>
void menu(){
std::cout << "1. Zamenjaj argumente\n";
std::cout << "2. Pridobi stanje\n";
std::cout << "3. Izklopi streznik\n";
std::cout << "4. konec\n";
std::cout << "Izbira: ";
}
int main(){
int izbira, l;
int runn = 1;
int arry[2];
int cev1, cev2, cev3;
int closep = 6;
unsigned long array[100];
while (runn == 1)
{
menu();
std::cin >> izbira;
switch (izbira){
case 1:
std::cout << "Vspisi dely v sekundah: ";
std::cin >> arry[0];
std::cout << "Vspisi stevilo branj: ";
std::cin >> arry[1];
cev1 = open("vhod", O_WRONLY);
write(cev1, &arry, sizeof(arry));
close(cev1);
break;
case 2:
cev2 = open("izhod", O_RDONLY);
if(cev2 < 0) std::cout << "tezava pri odpiranju cevi 0\n";
l = read(cev2, &array, sizeof(array));
if(l<0) std::cout << "tezava pri branju cevi \n";
for (int i = 0; i < 100; i += 5){
if(array[i] != 0)
std::cout << array[i] << " " << array[i+1] << " " << array[i+2] << " " << array[i+3] << " " << array[i+4] << "\n";
}
std::cout << "\n";
if(close(cev2) != 0) std::cout << "tezava pri zapiranju cevi 0\n";
break;
case 3:
cev3 = open("izklop", O_WRONLY);
write(cev3, &closep, sizeof(closep));
close(cev3);
runn = 0;
break;
default:
runn = 0;
break;
}
}
return 0;
}

View File

@@ -0,0 +1,180 @@
#include <pthread.h>
#include <sys/sysinfo.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <iostream>
#include <list>
#include <cstring>
struct SystemInfo{
unsigned long memTotal;
unsigned long memFree;
long upTime;
unsigned long swapTotal;
unsigned long swapFree;
};
struct MesData{
unsigned int size, delay;
};
struct MesData mezureData;
std::list<SystemInfo> listSI;
int running = 1;
int icev1, icev2, icev3;
pthread_t tid[4];
void* glavna(void* arg){
int i, l;
while (running == 1){
icev3 = open("izklop",O_RDONLY);
if(icev3 < 0) std::cout << "tezava pri odpiranju cevi 2\n";
l = read(icev3, &i, sizeof(i));
if(l<0) std::cout << "tezava pri branju cevi 2\n";
if(i > 2){
pthread_cancel(tid[2]);
pthread_cancel(tid[3]);
running = 0;
}
if(close(icev3) != 0) std::cout << "tezava pri zapiranju cevi 0\n";
}
return 0;
}
void* mezuringNode(void* arg){
struct sysinfo si;
struct SystemInfo info;
unsigned int microsecond = 1000000;
while (running == 1)
{
sysinfo (&si);
info.memTotal = si.totalram;
info.memFree = si.freeram;
info.upTime = si.uptime;
info.swapFree = si.freeswap;
info.swapTotal = si.totalswap;
listSI.push_front(info);
while(listSI.size() > mezureData.size){
listSI.pop_back();
}
usleep(mezureData.delay * microsecond);
}
return 0;
}
void* input(void* arg){
int tmp[2];
int l;
while(running == 1){
icev1 = open("vhod",O_RDONLY);
if(icev1 < 0) std::cout << "tezava pri odpiranju cevi 0\n";
l = read(icev1, &tmp, sizeof(tmp));
if(l<0) std::cout << "tezava pri branju cevi 0\n";
std::cout << tmp[0] << " " << tmp[1] << "\n";
mezureData.delay = tmp[0];
mezureData.size = tmp[1];
if(close(icev1) != 0) std::cout << "tezava pri zapiranju cevi 0\n";
}
return 0;
}
void* output(void* arg){
unsigned long array[100];
int l, i = 0;
while(running == 1){
icev2 = open("izhod",O_WRONLY);
if(icev2 < 0)
std::cout << "Napaka pri odprtju cevi 1\n";
else
std::cout << "Odprta cevi 1\n";
i = 0;
for (auto& elm : listSI){
array[i] = elm.memTotal;
i++;
array[i] = elm.memFree;
i++;
array[i] = elm.upTime;
i++;
array[i] = elm.swapFree;
i++;
array[i] = elm.swapTotal;
i++;
}
l = write(icev2, &array, sizeof(array));
if(l < 0)
std::cout << "tezave pri pisanju v cev\n";
else
std::cout << "Vpisano v cevi 1\n";
if(close(icev2) != 0)
std::cout << "tezava pri zapiranju cevi 1\n";
else
std::cout << "Zaprta cevi 1\n";
usleep(10000);
}
return 0;
}
int main(){
std::cout << "Hello World\n";
mezureData.delay = 1;
mezureData.size = 4;
mkfifo("vhod", S_IRUSR|S_IWUSR);
mkfifo("izhod", S_IRUSR|S_IWUSR);
mkfifo("izklop", S_IRUSR|S_IWUSR);
pthread_create(&tid[0], NULL, glavna, NULL);
pthread_create(&tid[1], NULL, mezuringNode, NULL);
pthread_create(&tid[2], NULL, input, NULL);
pthread_create(&tid[3], NULL, output, NULL);
pthread_join(tid[0], NULL);
pthread_join(tid[1], NULL);
pthread_join(tid[2], NULL);
pthread_join(tid[3], NULL);
std::string str;
char* strc;
for (auto& elm : listSI){
str += "TotalMemory: " + std::to_string(elm.memTotal) + " ";
str += "FreeMemory: " + std::to_string(elm.memFree) + " ";
str += "UpTime: " + std::to_string(elm.upTime) + " ";
str += "FreeSwap: " + std::to_string(elm.swapFree) + " ";
str += "TotalSwap: " + std::to_string(elm.swapTotal) + "\n";
}
strc = &str[0];
printf("%s",strc);
close(icev1);
close(icev2);
close(icev3);
unlink("vhod");
unlink("izhod");
unlink("izklop");
return 0;
}