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.