Dubbio teorico su shell

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
afterjames
Linux 0.x
Linux 0.x
Messaggi: 64
Iscritto il: lun 14 gen 2008, 14:14

Dubbio teorico su shell

Messaggio 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

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: Dubbio teorico su shell

Messaggio 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

afterjames
Linux 0.x
Linux 0.x
Messaggi: 64
Iscritto il: lun 14 gen 2008, 14:14

Re: Dubbio teorico su shell

Messaggio da afterjames »

Esegue "al volo" in che senso?

Avatar utente
FireEater
Linux 3.x
Linux 3.x
Messaggi: 508
Iscritto il: sab 5 feb 2005, 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino

Re: Dubbio teorico su shell

Messaggio 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

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: Dubbio teorico su shell

Messaggio 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

afterjames
Linux 0.x
Linux 0.x
Messaggi: 64
Iscritto il: lun 14 gen 2008, 14:14

Re: Dubbio teorico su shell

Messaggio 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.

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: Dubbio teorico su shell

Messaggio da Paoletta »

Quindi se non lancia un nuovo processo è come se eseguisse una funzione.
sì, è così;

Rispondi