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;
}

GITHUB REPO HERE!!!

Powered by: FreeFlarum.
(remove this footer)