Process killer! Un programma in C++ che restituisce i 5 processi che stanno consumando più memoria sul sistema permettendo all'utente di killarli scegliendoli dalla lista.
Vediamo le funzioni principali del programma, executeCommand(const string& command):
prende come input un comando da eseguire nel terminale e restituisce l'output di quel comando. Con popen
si apre una pipe sul comando e legge l'output linea per linea fino a concluderlo.
getTopProcesses(int n):
prende un intero n
(come input) e restituisce dentro un vettore n
che corrispondono ai processi. Con ps
i processi verranno elencati in base alla memoria consumata. ps -eo pid,%mem,comm --sort=-%mem | head -n <n+1> | tail -n <n>
displayProcessInfo(const vector<string>& processes):
prende come input il vettore e lo restituisce, se il vettore è vuoto viene visualizzato l'opportuno messaggio.
killProcess(const string& pid):
prende come input l'ID del processo da terminare (PID) come stringa e lancia il comando kill -9 per terminarlo. Sfrutta la funzione system() (di sistema) per eseguirlo nella shell.
Riassumendo nel main():
si usa getTopProcesses(5)
per ottenere i primi 5 processi che consumano più memoria, displayProcessInfo()
per restituirli, si chiede all'utente di selezionare un processo da terminare e con killProcess()
si termina il processo.
Oltre all'utilità credo sia un esercizio utile per migliorare con l'interazione linguaggio - sistema operativo tramite comandi shell per ottenere info su processi. Importante la modularità per mantenere i passaggi ben organizzati.
Installazione:
$ git clone https://github.com/Samueleex/processkiller
$ cd processkiller
Ora compiliamo il file.
$ g++ -o process process.cpp
$ ./process
Codice:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstdio>
using namespace std;
string executeCommand(const string& command) {
string output;
FILE* pipe = popen(command.c_str(), "r");
if (!pipe) {
cerr << "errore" << endl;
return output;
}
char buffer[128];
while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
output += buffer;
}
pclose(pipe);
return output;
}
vector<string> getTopProcesses(int n) {
string command = "ps -eo pid,%mem,comm --sort=-%mem | head -n "+to_string(n+1)+" | tail -n " + to_string(n);
string output = executeCommand(command);
istringstream iss(output);
vector<string> topProcesses;
string line;
getline(iss,line);
while (getline(iss,line)) {
topProcesses.push_back(line);
}
return topProcesses;
}
void displayProcessInfo(const vector<string>& processes) {
if (processes.empty()) {
cout << "No processes found." <<endl;
return;
}
cout << "Top 5 memory-consuming processes:" <<endl;
for (size_t i=0; i<processes.size(); ++i) {
cout << i+1 <<". "<< processes[i] <<endl;
}
}
void killProcess(const string& pid) {
string killCommand = "kill -9 " + pid;
system(killCommand.c_str());
}
int main() {
vector<string> topProcesses = getTopProcesses(5);
displayProcessInfo(topProcesses);
cout << "Numero del processo da killare (0 per uscire): ";
int choice;
cin >> choice;
if (choice>0 && choice<=static_cast<int>(topProcesses.size())) {
stringstream ss(topProcesses[choice - 1]);
string pid;
ss >> pid;
killProcess(pid);
cout << "Processo killato." <<endl;
} else {
cout << "Nessun processo killato." <<endl;
}
return 0;
}