Didattica C: Passaggio parametri da linea di comando

Quando si opera in ambito shell solitamente si creano programmi capaci di accettare diversi parametri che serviranno per impostare o modificare diverse componenti del software stesso. Vediamo come scrivere del codice in C per abilitare e gestire argomenti passati al programma da linea di comando.

Iniziamo col vedere il codice utile a svolgere tale scopo:

int main(int argc, char* argv[])

Quello che si vede è il classico main presente, necessariamente, in ogni programma scritto in C. Chi ha dimestichezza con il linguaggio in questione noterà che tra le parentesi che normalmente si lasciano vuote sono presenti due nuove variabili, argc ed argv[].

int Argc è un intero che contiene il numero di parametri passati al programma mediante la riga di comando. Si noti che se i parametri passati sono n, argc varrà n+1 poichè esso conteggia anche il programma stesso.

char* Argv[] (o equivalentemente **argv) è un array di tipo puntatore a char (carattere) e contiene le stringhe equivalenti ai vari parametri. Ogni elemento del vettore infatti contiene il parametro salvato come stringa. Da notare che in argv[0] è salvato il nome del programma stesso.

Vediamo un esempio.

Prendiamo un semplice codice C che legge i dati passati da riga di comando r gli stampa nuovamente nel terminale.

int main(int argc, char* argv[])

{
int i;

//-- leggiamo ogni parametro presente in linea di comando
for ( i=0 ; i!=argc ; i++ ){
printf("%s\n", argv[i]);
}

return 0;

}

Il codice in questione è molto semplice. Esso, grazie ad un ciclo for, controlla di volta ogni parametro passato.

Compilando il programma e scrivendo nel terminale:

./programma cane gatto topo

Il terminale restituirà:

./programma
cane
gatto
topo

Infatti eseguendo il ciclo for si vede che per i=0 si ha argv[0] ovvero il nome del programma stesso, per i=1 si ha il primo parametro cioè cane per i=2 si ha il secondo parametro e così via.

Come si vede l’uso dei parametri è abbastanza facile e permette una versatilità del software abbastanza potente pur non avendo a disposizione una GUI con la quale impostare i valori.

Password di root nei propri programmi


Ci sono volte in cui nello scrivere i propri programmi si ricorra ai comandi che GNU/Linux offre da riga di comando. Scegliere questo approccio semplifica la vita ai programmatori rendendo i programmi più leggeri e sfruttando appieno la più potente delle “armi” *nix: il terminale!

Si sa però (basta avere un minimo di dimestichezza con il mondo del pinguino) che ci sono dei comandi che possono essere eseguiti solo dall’amministratore del sistema che nei sistemi operativi GNU/Linux prende il nome di root. Quand si prova ad eseguire un comando da amministratore viene chiesta la password, ovvero la password di root. Come fare allora a restituire al sistema questa parola chiave in maniera sicura? Il primo problema che sorge infatti è la sicurezza. Trasmettere una parola così delicata in chiaro significherebbe compromettere quella sicurezza su cui il sistema operativo libero basa la sua diffusione. Ovviamente ci sarebbe la possibilità di criptare la parola digitata e poi decriptarla solo per permettere al comando del terminale di leggerla, ma questo renderebbe il programma alquanto complesso. Come fare allora?
Se si sta sviluppando un programma ad interfaccia grafica e si lavora su sistemi *buntu e derivate è possibile usare due ottimi strumenti gksudo e ksudo; entrambi svolgono lo stesso lavoro ma la differenza tra i due è che uno lavora in ambiente GNOME e l’altro in ambiente KDE. Essi vanno a sostituire il normale uso di sudo in modo che al momento di immettere la password di root si presenti una finestra che vada ad agevolare il lavoro di trasmissione della stessa al comando senza compromettere la normale sicurezza del sistema e quindi del nostro codice.

ESEMPIO

Immaginiamo di voler installare un normale software mediante terminale. Il comando sarebbe

sudo apt-get install programma

e il terminale ci mostrebbere la classica richiesta

[sudo] password for user:

Se invece sostuiamo il comando con

gksudo apt-get install programma

allora ci si presenta davanti una finestra nella quale immettere la parola chiave.

In questo modo si può con molta praticità eseguire comandi da root senza preoccuparsi di gestire la correttezza della sua password.

E’ da precisare che qualora il comando da eseguire con permessi di root prevede alcuni parametri contraddistinti dal segno – allora tale comando va chiuso tra apici.

ESEMPIO:

gksudo 'cat -h'

Qualora sappiate se questo metodo funziona anche con altri sistemi o conoscete per altre distro che svolgano lo stesso lavoro vi chiedo di segnalarmelo per poter completare il post.

Tabulazioni e spazi nell’HTML


Quando si gestisce un blog o un sito come questo è di notevole importanza postare codice per chiarire al meglio gli argomenti trattati ai lettori.
Ogni buon programmatore sa che per avere un codice leggibile e chiaro è fondamentale usare l’indentazione, ovvero l’inserimento di spazi bianchi (o tabulazioni) che precedono alcune parti di codice per creare un effetto grafico che evidenzia dove inizia e dove finisce un blocco di codice. Al fine della compilazione del codice, l’uso di questa tecnica non è fondamentale ma rende sicuramente il codice più “pulito” e più “chiaro” per se e per gli altri.

Lavorando su piattaforma blogger/blogspot ho notato che quando si scrive una frase preceduta da una tabulazione o da alcuni spazi bianchi, nel momento in cui si visualizza il post essi vengono ignorati e il codice risulta piatto, più simile ad una lista della spesa che ad un lavoro di altissima programmazione ingegneristica :-).

Ecco allora che giungono in aiuto i tag html.

Esiste un particolare elemento html che permette di interpretare tutto ciò che è inserito tra i tag così come si presenta. Questo vuol dire che se una frase è preceduta da spazi bianchi allora nel post essa si presenterà così com’è. Tutto ciò è di particolare importanza per chi scrive codice poichè racchiudendo il listato tra i tag pre e /pre (ovviamente chiusi tra parentesi angolari ) esso si presenterà così come lo avete scritto.

Ecco la differenza tra un codice con il tag pre e il codice senza pre

CON PRE


if (a==b)
{
printf("a uguale a b"\n);
return 1;
}

SENZA PRE


if (a==b)
{
printf("a uguale a b"\n);
return 1;
}

Converrete con me che la differenza in fatto di chiarezza è rilevante già su quattro righe di codice. Non pensate che su un programma intero la cosa lo renderebbe più chiaro?