2015-05-13 13 views
8

Sto scrivendo un programma C che include una pagina ABOUT. Stavo pensando che quando l'utente sceglie di leggere quella pagina, la console si azzera (come se eseguissi il comando clear in linux bash) e mostri il contenuto della pagina. Dopo la navigazione un po 'ho trovato questa soluzione:Le funzioni di sistema() C sono ok?

system("clear"); 

È questo ok? Voglio dire, è sicuro da usare in un programma? quali sono i vantaggi e gli svantaggi?

+3

Posso suggerire un'alternativa compatibile multipiattaforma: non cancellare lo schermo :) In alternativa è possibile scrivere 100 righe vuote per ottenere uno schermo vuoto, ma il testo si troverà invece nella parte inferiore della console. –

+0

@ssg: Mentre scrivo questo, ho una finestra di terminale alta 105 righe. (È in esecuzione 'tcvt' in una finestra di xterm a schermo intero). Se vuoi cancellare lo schermo, cancella semplicemente lo schermo, anche se non esiste un modo * portatile * per farlo. Oppure, come suggerisci, considera di non cancellare lo schermo ed eventualmente di cancellare le informazioni dell'utente. –

+0

@KeithThompson Supponevo che la "about page" fosse alta almeno la metà dello schermo, indirizzando la maggior parte delle configurazioni a termine, ma hai ragione. –

risposta

9

In un senso che system è una parte della libreria C standard, la funzione stessa è completamente sicura. Il problema si trova nella parte di comando della chiamata, ad esempio "clear" nell'esempio. Questo è fortemente dipendente dal sistema, rendendo il tuo programma non portatile.

Una soluzione comune a questo problema è fornire i comandi separatamente dal programma (ad esempio in un file) o definirli in una parte del codice che compila in modo condizionale. La prima soluzione è leggermente più flessibile, ma la seconda soluzione è più semplice da implementare.

Come potrei implementare una soluzione che avrebbe eseguito system("clear") per Linux Terminal e system("cls") per il Terminal di Windows?

L'approccio con la compilazione condizionale apparirebbe come segue: in primo luogo, ha messo queste definizioni nel programma

#ifdef WIN_TERMINAL 
#define CLEAR_COMMAND "cls" 
#endif 
#ifdef UNIX_TERMINAL 
#define CLEAR_COMMAND "clear" 
#endif 

Ora usare questo comando nel codice:

system(CLEAR_COMMAND); 

Quando si compila il UNIX, passare -D UNIX_TERMINAL durante la compilazione del programma. Questo di solito va nel tuo Makefile. Su Windows, passare /D WIN_TERMINAL al compilatore. Questo di solito va nella lista flag del preprocessore del tuo progetto Visual Studio.

+0

@bauer Un modo migliore per dirla è che ottenere una buona portabilità sul codice che utilizza 'system' richiede uno sforzo un po 'significativo. – dasblinkenlight

+2

Non è "completamente sicuro" se capita di essere un comando 'clear' nel' $ PATH 'dell'utente che fa qualcosa di brutto. (Voglio dire, anche più cattivo che cancellare lo schermo.) –

+0

@dasblinkenlight Come potrei implementare una soluzione che eseguisse system ("clear") per Linux Terminal e system ("cls") per Windows Terminal? –

2

Vantaggio: è un metodo veloce e ben definito, perché non esiste un'altra "funzione pronta" per eseguire questa operazione.

Svantaggio: dipende dal sistema operativo. Su Windows, è necessario utilizzare system("cls").

+0

Quindi, per quanto ho capito, la funzione system() è sicura ma non ha una buona portabilità, corretta? –

+1

Forse dovresti chiarire che non esiste una funzione standard per farlo, e ci sono librerie, per la maggior parte dei sistemi operativi che possono inviare caratteri di controllo ai terminali per ottenere questo tipo di cose, non tutti gli emulatori di terminale li supporteranno comunque. –

+0

@bauer, no, che non ha nulla a che fare con la funzione 'system()', è il comando. –

0

Ci sono grossi svantaggi nell'eseguire un comando via sistema. In primo luogo ci sono implicazioni sulla sicurezza e differenze di piattaforme.

Idealmente, è necessario stampare le sequenze di escape della piattaforma per produrre il risultato desiderato o interfacciare con l'API della piattaforma. Ciò ridurrà le dipendenze che esistono i comandi cls/clear, oltre a prevenire risultati indesiderati se tali comandi non sono standard.

+0

Non vi è alcuna implicazione di sicurezza per l'uso della funzione 'system()' C e di un comando di cancellazione del terminale dipendente dal sistema operativo. Se il codice sorgente viene mantenuto sul sistema in questione, non compilato, e qualcuno che conosce una cosa o due sul codice C lo trova e cambia il codice, allora c'è un problema di sicurezza molto più grande di un 'cls' o' clear' comando chiamato nella funzione C 'system()' ... – Yokai

Problemi correlati