MinShell - le funzioni exec

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include <unistd.h>
 4#include <sys/wait.h>
 5
 6int main() {
 7   char comando[256];
 8   pid_t pid; int status;
 9
10   while(1)
11   {
12     printf("Digitare un comando: ");
13     int res = scanf("%s",comando);
14     if(res == EOF) continue;
15     pid = fork();
16     if ( pid == -1 ) {
17       printf("Errore nella fork.\n");
18       exit(1);
19     }
20     if ( pid == 0 )
21        execlp(comando, comando, NULL);
22     else wait(&status);
23   }
24   return 0;
25}

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.

MinShell è un programma C che emula questo comportamento. Il principio di funzionamento è analogo a quello di FEW.

Tuttavia, ricorrendo alla sola syscall fork, FEW: può solo creare processi con il medesimo programma del processo parent. Per superare questo limite, è possibile ricorrere alla famiglia di funzioni exec. Grazie ad una syscall di tipo 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 fork

  • il processo child invoca una funzione di tipo exec

  • il processo principale attende la sua terminazione tramite wait

Per sostituire il programma di un’immagine, una funzione 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 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 execlp

Domanda

Supponendo di lanciare MinShell da linea di comando, qual è l’ambiente del processo child?

  • il secondo e i successivi parametri della funzione execlp vengono passati come parametri per l’eseguibile

Osservazione

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