Domanda

Ho spesso sentito dire che utilizzando system("PAUSE") è cattiva pratica e di utilizzare invece std::cin.get(). Ora la mia comprensione delle chiamate di sistema è che prendono una stringa che entrano in una linea di comando di sistema e parlare con il sistema operativo, in modo PAUSE è un comando DOS che mette in pausa l'output nella finestra di comando. Suppongo che questo funziona in modo simile con Mac e Unix con diverse parole chiave, e l'utilizzo di chiamate di sistema è scoraggiato a causa di una mancanza di compatibilità tra OS. (Se mi sbaglio con tutto questo, per favore correggetemi)

la mia domanda è questa: quando è opportuno utilizzare il sistema) (chiamate? Come dovrebbero essere applicati? Quando non dovrebbero essere applicati?

È stato utile?

Soluzione

system("PAUSE") è certamente meno che ideale. mediante una chiamata a sistema crea un sottoprocesso, che su Windows è abbastanza costoso e in ogni caso non particolarmente a buon mercato su qualsiasi sistema operativo. Su sistemi embedded il sovraccarico della memoria è significativo.

Se non v'è alcun modo per farlo senza molto dolore in modo nativo allora fatelo. Nel caso di attesa per l'utente prema un tasto, cin.get () sarà molto difficile da battere. In questo caso, il processo di applicazioni sarà solo bloccare lo stdin, impostando solo poche bandiere visibili al kernel, e, soprattutto, non alloca nuova memoria e non crea nuove entità di programmazione, nemmeno un gestore di interrupt.

Inoltre, lavorerà lo stesso su tutti i sistemi operativi con tutti i compilatori C ++, dal momento che utilizza solo una caratteristica di base di una parte molto standard del linguaggio, piuttosto che dipende da niente il sistema operativo fornisce.

EDIT: predire la vostra preoccupazione che non importa se è costoso, perché tutta la idea è quello di mettere in pausa. Beh, prima di tutto, se costoso, quindi sta andando a male le prestazioni per qualsiasi altra cosa che potrebbe essere in corso. Avete mai notato (su Windows) quando un'applicazione lancia, altri, applicazioni già aperte diventano troppo meno reattivo? Inoltre, l'utente potrebbe non essere un essere umano vivo, ma piuttosto di un altro programma di lavoro per conto di un utente umano (Say, uno script di shell). Lo script sa già cosa fare e in grado di pre-fill stdin con un carattere per saltare l'attesa. Se avete usato un sottoprocesso qui, lo script sperimenterà un (notevole ad un essere umano) ritardo. Se lo script sta facendo questo centinaia (o centinaia di milioni!) Di volte, uno script che potrebbe richiedere secondi per eseguire la società richiede giorni o anni.

EDIT2: quando utilizzare system(): quando si ha bisogno di fare qualcosa che un altro processo fa, che non si può fare facilmente. system() non è sempre il miglior candidato perché fa due cose che sono un po 'limitante. In primo luogo, l'unico modo per comunicare con il sottoprocesso è per la linea di comando come input e il valore restituito come output. La seconda è che i blocchi di processo genitore fino a quando il processo figlio ha completato. Questi due fattori limitano i casi in cui il sistema è utilizzabile.

sui sistemi Unixy, la maggior parte dei sottoprocessi accadere con fork perché permette lo stesso programma di continuare nello stesso luogo, come due processi separati, uno come figlio dell'altro (che è difficilmente visibile a meno che non si chieda qualcosa dal sistema operativo) . Su Linux, questo è particolarmente ben ottimizzato, e circa economico come la creazione di un pthread. Anche nei sistemi in cui questo non è veloce, è ancora molto utile (come dimostrato dalla metodologia apache processo-pool) (disponibile nelle finestre / collegamento in Unix documenti )

altri casi (anche su Windows!) Sono spesso gestite da popen o familiare exec di funzioni. popen crea un sottoprocesso e un nuovo tubo di collegamento a stdin o stdout i sottoprocessi. Entrambi i processi padre e figlio possono quindi eseguire contemporaneamente e comunicare abbastanza facilmente. ( link per finestre docs / link alla documentazione UNIX )

* exec famiglia di funzioni (ce ne sono diversi, execl, execv e così via) d'altra parte fa sì che il programma in corso di essere sostituito dal nuovo programma. Il programma originale esce in modo invisibile e il nuovo processo prende il sopravvento. Quando poi nuovi rendimenti di processo, tornerà a qualsiasi chiamata il processo originale, come se quel processo era tornato a quel punto, invece di svanire. Il vantaggio di questo corso exit(system("command")) è che non viene creato nessun nuovo processo, il tempo e la memoria (anche se non sempre terribilmente tanto) ( link per finestre docs / link per Unix docs )

system potrebbe plausibilmente essere utilizzato da qualche strumento di script per richiamare diversi passaggi in qualche azione ricetta. Per esempio, ad un certo punto, un programma potrebbe usare system per invocare un editor di testo per modificare alcuni file di configurazione. Non deve riguardano troppo per sé molto con quello che succede, ma dovrebbe certamente attendere fino a quando l'utente ha salvato e chiuso l'editor prima di continuare. Si può quindi utilizzare il valore di ritorno per scoprire se la sessione di modifica ha avuto successo, nel senso che l'editor effettivamente aperto il file richiesto (e che l'editor in sé esisteva affatto!), Ma leggerà i risultati effettivi della sessione da il file modificato direttamente, piuttosto che comunicare con il sottoprocesso. ( link per finestre docs / link per Unix docs )

Altri suggerimenti

Le chiamate di sistema vengono inviati alla shell o riga comandi interprete del sistema operativo (DOS, bash, ecc) e la sua fino alla shell di fare ciò che vuole con questo comando.

Si dovrebbe evitare l'uso di questo tipo di chiamate come sarebbe ridurre la portabilità dei programmi per lavorare con altri sistemi operativi. Vorrei pensare solo quando si è assolutamente sicuri che il codice si rivolge ad un sistema operativo specifico che si dovrebbe usare tali chiamate.

  

Ma la mia domanda è questa: quando è opportuno utilizzare le chiamate di sistema ()? Come dovrebbero essere applicati?

Quando non è possibile fare la cosa che stai cercando di fare con il proprio codice o una libreria (o il costo della sua applicazione supera il costo di lancio di un nuovo processo di farlo). system () è piuttosto costoso in termini di risorse di sistema rispetto al cin.get (), e come tale deve essere usato solo quando è assolutamente necessario. Ricordate che il sistema () in genere lancia sia un'intera nuova shell e qualsiasi programma che hai chiesto per eseguire, di modo che è due nuovi eseguibili in fase di lancio.

A proposito, Sistema () di chiamata non dovrebbe mai essere utilizzato con i binari con SUID o SGID bit impostato, citando il pagina man :

  

Non utilizzare il sistema () da un programma con il set-user-ID e set-group-ID   privilegi, perché i valori strani per alcune variabili d'ambiente   potrebbe essere utilizzato per sovvertire l'integrità del sistema. Utilizzare l'exec (3) famiglia di   Funzioni invece, ma non execlp (3) o execvp (3). system () non sarà,   infatti, il corretto funzionamento di programmi con set-user-ID e set-group-ID   privilegi sui sistemi su cui / bin / sh è bash versione 2, dal momento che bash 2   gocce privilegi all'avvio.

Per quanto ne so system ( "PAUSE") è una finestra unica cosa, ed è per questo che è visto di buon occhio.

system() viene utilizzato per chiedere al sistema operativo di eseguire un programma.

Perché il programma di volere al sistema operativo di eseguire un programma? Beh ci sono casi. A volte un programma o del sistema operativo comando esterno in grado di eseguire un compito che è difficile da fare nel proprio programma. Ad esempio, un programma esterno può operare con privilegi elevati o formati di dati di accesso di correttezza.

La funzione system(), in sé, è abbastanza portatile, ma la stringa di comando si passa è probabile che sia-piattaforma specifica molto -. Anche se la stringa di comando può essere tirato da dati di configurazione locali per renderlo più indipendente dalla piattaforma

Altre funzioni come fork(), exec*(), spawn*() e CreateProcess() vi darà molto più controllo sul modo in cui si esegue il programma esterno, ma sono specifici della piattaforma e potrebbero non essere disponibili sulla propria piattaforma di scelta.

system("PAUSE") è un vecchio trucco del DOS ed è generalmente considerato come stile piuttosto brutta in questi giorni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top