std::system în C++

Rulează o comandă în shell-ul sistemului de operare și așteaptă să se termine.

Sintaxă
int system(const char* comanda);

Ce face std::system

std::system pornește interpretorul de comenzi (sh pe Linux/macOS, cmd.exe pe Windows) cu textul dat și așteaptă terminarea comenzii. Ce afișează comanda apare direct pe ecran, nu este returnat programului.

Valoarea returnată depinde de sistem. Pe Linux/macOS conține codul de ieșire al comenzii, codificat; îl extragi cu WEXITSTATUS din <sys/wait.h>. std::system(nullptr) spune dacă există un shell disponibil.

Golește ieșirea programului (std::fflush(stdout)) înainte de apel, altfel textele pot apărea în altă ordine.

Parametri

Parametru Descriere
comanda Comanda de rulat, ca text C; nullptr doar verifică dacă există shell.

Ce returnează

O valoare dependentă de sistem (de obicei starea de ieșire a comenzii).

Exemple

Exemplul 1: Rularea unei comenzi

#include <cstdio>
#include <cstdlib>
#include <print>

int main() {
    std::println("Shell disponibil: {}", std::system(nullptr) != 0);
    std::fflush(stdout);

    int rezultat = std::system("echo Salut din shell");
    std::println("Comanda a returnat {}", rezultat);
}

Rezultat

Shell disponibil: true
Salut din shell
Comanda a returnat 0

Exemplul 2: Codul de ieșire al comenzii (Linux/macOS)

Valoarea brută 768 este 3 · 256; WEXITSTATUS extrage codul real, 3. Pe Windows valoarea este chiar codul.

#include <cstdlib>
#include <print>
#include <sys/wait.h>

int main() {
    int brut = std::system("exit 3");
    std::println("Valoare brută: {}", brut);
    std::println("Codul comenzii: {}", WEXITSTATUS(brut));
}

Rezultat

Valoare brută: 768
Codul comenzii: 3

Greșeli frecvente

  • Pui în comandă text primit de la utilizator (system(("ping " + adresa).c_str())): cineva poate scrie ; rm -rf ~. Nu construi comenzi din date nesigure.
  • Folosești system("pause") sau system("cls"): funcționează doar pe Windows.

Comenzi înrudite

  • std::exit: Oprește imediat programul cu un cod de ieșire; rulează funcțiile atexit și distruge obiectele statice, dar nu și pe cele locale.
  • std::getenv: Citește valoarea unei variabile de mediu (de exemplu HOME sau PATH); returnează nullptr dacă nu există.