2015-07-28 23 views
5

Sto cercando di capire le chiamate di sistema fatte in C++ usando il sistema ("qualche comando"). ecco il codicecome funziona la funzione system() in C++?

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main() 
{ 
    cout << "Hello "; 
    system("./pause"); 
    cout << "World"; 
    cout << endl; 

    return 0; 
} 

la "pausa" eseguibile viene creato dal seguente codice

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout<<"enter any key to continue\n"; 
    cin.get(); 
    return 0; 

} 

ottengo il seguente output

enter any key to continue 
1 
Hello World 

Qualcuno può spiegare l'uscita a me? Mi aspettavo questo -

Hello 
enter any key to continue 
1 
World 
+1

L'aspettativa è dovuta al buffering 'std :: cout', non è correlato al sistema. Se cambi 'cout <<" Hello ";' a 'cout <<" Hello "<< endl;' dovresti vedere cosa ti aspettavi. – Telokis

+3

Si noti che il nome "system call" è già preso da [un altro concetto] (https://en.wikipedia.org/wiki/System_call). – nwp

risposta

4

La risposta su "come si fa system funzione di libreria funziona?" è solitamente specifico del sistema operativo. Vedi here per un punto di vista Linux. Si noti che system è non a system call e non vi è una relazione a priori tra l'utilizzo di system(3) e il buffer cout in corso di svuotamento.

Si dovrebbe lavare l'stdout prima di chiamare system

cout << "Hello " << flush; 

o, preferibilmente,

cout << "Hello " << endl; 

Il comportamento che si sta osservando è perché cout è tamponata e si è dimenticato di svuotare il buffer.

+0

la mia domanda ha più a che fare con la sequenza di esecuzione del codice. "ciao" avrebbe dovuto essere stampato per primo, seguito dalla chiamata di sistema e poi dal mondo – aseembits93

5

La ragione per il comportamento particolare si osserva sembra essere solo cout buffer: il Hello non viene stampato immediatamente, invece tenuto in un buffer fino endl è uscita (o il buffer è pieno completamente, o chiamare esplicitamente flush()) . Questo non è in alcun modo correlato a una chiamata system().

Un esempio più semplice:

cout << "Hello"; 
sleep(10); 
cout << "World"; 

Entrambe le parole appariranno allo stesso tempo, non con un ritardo di 10 secondi.

+0

C'è un altro caso a parte 'endl' o riempire il buffer che lo scarica: chiamando' flush' (che è ciò che 'endl' fa). –

+0

@JonathanWakely, oh sì, ho aggiornato la risposta su questo – Petr

5

Probabilmente non è un caso di chiamata di sistema ma di buffering del flusso di output.

cout << "xxx" non emette alcun output, quindi il programma chiamato da system può essere eseguito prima che lo cout lo svuotino nella console.

prova ad aggiungere cout.flush() dopo cout << "Hello" o scrivere cout << "Hello" << flush

anche: cout << endl chiama automagically flush

+0

Non lo chiamerei "automagicamente" poiché è definito in modo esplicito per chiamare 'flush' –

+0

@JonathanWakely per chi inizia a lavorare con flussi C++ sembra poco magico, come molte persone pensano che 'std :: endl' sia un' std :: string' con '" \ n "' all'interno. "automagic" si riferiva a "chiamare la funzione senza() visibile". Forse non le migliori parole :) – Hcorg

+0

Ah ok, allora immagino che sembri magico da quella prospettiva :) –

5

system esegue un comando in una shell. Ma il tuo problema non è con system ma con cout. cout è bufferizzato dalla linea, es. non scaricherà (scriverà) i suoi dati finché non incontrerà un nuovo carattere di linea. Devi svuotarlo esplicitamente con cout << flush.