.. role:: raw-html(raw) :format: html MinShell - le funzioni exec =========================== .. code-block:: c :linenos: #include #include #include #include int main() { char comando[256]; pid_t pid; int status; while(1) { printf("Digitare un comando: "); int res = scanf("%s",comando); if(res == EOF) continue; pid = fork(); if ( pid == -1 ) { printf("Errore nella fork.\n"); exit(1); } if ( pid == 0 ) execlp(comando, comando, NULL); else wait(&status); } return 0; } Una shell è una interfaccia testuale per il sistema operativo attraverso la quale è possibile eseguire comandi e programmi. Ogni qual volta si lancia un programma X tramite shell, quest'ultima crea un nuovo processo la cui immagine è quella del programma X. :raw-html:`MinShell ` è un programma C che emula questo comportamento. Il principio di funzionamento è analogo a quello di :doc:`FEW `. Tuttavia, ricorrendo alla sola syscall fork, :doc:`FEW `: può solo creare processi con il medesimo programma del processo parent. Per superare questo limite, è possibile ricorrere alla famiglia di funzioni :posix:`exec `. Grazie ad una syscall di tipo :posix:`exec ` è possibile sostituire completamente l'immagine del processo che invoca la system call con quella di un altro programma. Di conseguenza, lo schema di esecuzione di MinShell è il seguente: * il processo principale crea un processo child tramite :posix:`fork ` * il processo child invoca una funzione di tipo :posix:`exec ` * il processo principale attende la sua terminazione tramite :posix:`wait ` Per sostituire il programma di un'immagine, una funzione :posix:`exec ` ha bisogno: * individuare l'esatta posizione del programma nel filesystem * setup dell'ambiente di esecuzione * eventuali parametri da passare al programma target A tal scopo la funzione :posix:`execlp `: * considera il primo parametro come il nome dell'eseguibile target, il quale viene cercato nei percorsi definiti nella variabile di ambiente PATH * eredita l'ambiente dal processo che invoca :posix:`execlp ` .. question_note:: Supponendo di lanciare MinShell da linea di comando, qual è l'ambiente del processo child? * il secondo e i successivi parametri della funzione :posix:`execlp ` vengono passati come parametri per l'eseguibile .. observation_note:: Tipicamente il primo parametro passato ad un programma è una stringa contenente il nome del programma stesso. L'ultimo parametro è impostato a NULL in quanto da standard POSIX la lista di parametri deve terminare con un puntatore NULL. Riferimenti """"""""""" * :posix:`exec `