Eseguire comandi di sistema in C++

Mattepuffo's logo
Eseguire comandi di sistema in C++

Eseguire comandi di sistema in C++

Eseguire comandi di sistema in C++ non è molto complicato.

Per farlo possiamo usare la funzione system().

Eccovi un semplice esempio su Linux:

#include <stdio.h>

#include <stdlib.h>

int main()

{

    printf("Eseguo comando ls");

    system("ls -l");

    exit(0);

}

Il problema di questa funzione è che anche se stampa il risultato del comando, comunque ritorna un int.

Quindi se ad esempio vogliamo stampare il risultato in un componente grafico tipo un QPlainTextEdit (che richiede quantomeno un oggetto string e non un int) come possiamo fare?

Ci sono diverse soluzioni; io ho usato la funzione popen().

Nel caso specifico ho una piccola classe con una funzione che esegue il comando nmap con i vari parametri.

Il comando arriva da un QPlainTextEdit e viene stampato su un altro QPlainTextEdit.

Quindi deve ritornare quanto meno una string (nel caso da trasformare poi in una QString).

La classe è questa:

#include "scan.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
using std::string;

Scan::Scan()
{
}

string Scan::scanNetwork()
{
    FILE *p = popen("ls -l", "r");
    string s;
    for (size_t count; (count = fread(buf, 1, sizeof(buf), p));)
    {
       s += string(buf, buf + count);
    }
    pclose(p);
    return s;
}

Ho semplificato un pò la funzione per lo scopo.

La funzione popen() richiede due argomenti di tipo char.

Il primo è il comando, il secondo riguarda i permessi ("r" il lettura e "w" in scrittura).

La funzione ritorna uno standard I/O stream.

Nel ciclo for (che in effetti ha una struttura un pò singolare) non facciamo altro che aggiungere alla string s il char scansionato attraverso fread(), che altro non fa che leggere uno stream.

Infine chiudiamo lo stream con pclose(p).

Notate che popen() è creato come un oggetto FILE, che in C++ è uno stream a tutti gli effetti.


Condividi

Commentami!