Pagina 1 di 1

Dubbio teorico su shell

Inviato: mer 20 feb 2008, 13:05
da afterjames
Salve a tutti e grazie in anticipo a quanti sapranno aiutarmi.Sto entrando con molta fatica nel mondo linux, ed ho un dubbio sulla shell.So che è un'interprete di comandi e bla bla bla.Mi interessa sapere qualcosa in più.Ora una shell dovrebbe essere qualcosa di questo tipo se non erro:

Codice: Seleziona tutto

//shell padre
char comando[256];
int status;
while(1){
    scanf("%s",comando);
    if (strcmp(comando,"exit");  //se digito exit esco
       break;
    pid_t pid = fork();
    if (pid==0){ //sono nel figlio
       execvp(comando,NULL);            //nel caso non vi siano parametri       
    } 
    else 
          wait(&status);
}
exit(0);
E fin qui mi è chiaro..Per ogni nuovo comando creo un nuovo processo shell che si occuperà di lanciarlo(senza creare un nuovo processo,con la chiamata execvp) e pongo il padre in attesa della terminazione.Il mio dubbio è questo:questo schema è valido per tutti gli eseguibili lanciati da shell?
Cioè se il comando fosse un mio banale programma c opportunamente compilato, la shell fa le stesse cose?Ed ancora..Questo schema è valido anche per i comandi interni?Grazie

Re: Dubbio teorico su shell

Inviato: gio 21 feb 2008, 11:32
da Paoletta
afterjames ha scritto:Cioè se il comando fosse un mio banale programma c opportunamente compilato, la shell fa le stesse cose?
yes; i programmi come "ls" sono programmi c!
afterjames ha scritto: Ed ancora..Questo schema è valido anche per i comandi interni?Grazie
no, li esegue al volo

Re: Dubbio teorico su shell

Inviato: gio 21 feb 2008, 11:52
da afterjames
Esegue "al volo" in che senso?

Re: Dubbio teorico su shell

Inviato: gio 21 feb 2008, 16:08
da FireEater
afterjames ha scritto:Esegue "al volo" in che senso?
I comandi della shell sono gestiti dal codice stesso della shell, quindi fa tutto padre senza generare nuovi processi.

Per esempio quando assegni una variabile o esegui istruzioni.

O tu per comandi interni intendi altro? :-k

Re: Dubbio teorico su shell

Inviato: gio 21 feb 2008, 17:49
da Blizzard
ciao!
qualcuno si ricorda di me??? :D (scherzo.... effettivamente è un bel po che non mi loggo)

se vuoi sapere qualcosa in più su shell e quant'altro ti consiglio di leggere qualcosa sulla programmazione di sistema linux.
Penso che per cominciare vada più che bene qualche slide di un generico corso di Laboratorio di Sistemi Operativi scaricata dai siti universitari.
Poi c'è un ottimo libro pdf gratuito che è Guida alla Programmazione in Linux, li potrai vedere in dettaglio i meccanismi di gestione dei processi, comunicazione, redirezione e sincronizzazione.
Alcuni di questi compiti infatti sono gestiti dalle shell che non hanno la semplice funzionalità di forkare processi ;)

Per precisare poi sullo strano meccanismo di fork in due parole posso dirti che in un sistema unix, l'unico modo per avere un processo è creare una copia di uno esistente.
Pertanto anche quando vuoi lanciare un programma... che sia ls o helloworld.out devi necessariamente creare una copia di un processo (con una fork) in modo da avere un processo figlio con la copia dell'ambiente del padre (descrittori dei files, prossima istruzione, ecc...) e poi tutto questo ambiente viene completamente rimpiazzato con una chiamata exec dal nuovo programma.
Nulla infatti ti vieta di usare exec senza fork.... ma poi quando termina il programma una cosa è certa.... non ti ritorna alla shell :P

ciao
Gio

Re: Dubbio teorico su shell

Inviato: gio 21 feb 2008, 18:24
da afterjames
Grazie a tutti..Io per comandi interni intendo proprio quelli della shell..Quindi se non lancia un nuovo processo è come se eseguisse una funzione.Il resto è tutto chiaro.

Re: Dubbio teorico su shell

Inviato: gio 21 feb 2008, 22:06
da Paoletta
Quindi se non lancia un nuovo processo è come se eseguisse una funzione.
sì, è così;