Questo è un esempio banale che mostra come implementare una semplice shell UNIX, non supporta i comandi che prendono uno o più parametri altrimenti bisognerebbe giocare un po’ di più con le stringhe.
Sotto UNIX, tutti i processi nascono tramite una chiamata alla funzione fork() dal proprio processo padre, tramite la quale è possibile “sdoppiare” il processo e generare un processo figlio (che nel nostro esempio sarà il comando da eseguire).
Ecco il codice sorgente:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define LEN_BUFFER 32 // dimensione dell'array 'comando' int main(int argc, char *argv[]) { char comando[LEN_BUFFER]; int pid; while (1) { printf("myShell::Digita un comando da eseguire (scrivi 'quit' per uscire): "); scanf("%s", comando); // controlla se "comando" == "quit", in tal caso esci if (strcmp(comando, "quit") == 0) break; // la chiamata fork() genera un altro processo con il medesimo codice del padre // l'unica differenza tra il padre e il figlio sarà il valore restituito da fork() // ritorna 0 al nuovo processo figlio, mentre al padre ritorna l'ID del processo figlio appena creato // in caso di errore, ritorna -1 pid = fork(); // termina in caso di errore nella chiamata fork() if (pid == -1) { printf("Errore nella fork()"); exit(1); } // se pid vale zero, ci troviamo nel processo figlio if (pid == 0) { execlp(comando, comando, NULL); // se il comando appena eseguito termina con successo non arriveremo mai a questo punto, in caso contrario segnaliamo errore printf("Errore nell'esecuzione di %sn", comando); exit(2); } // se pid non vale zero, siamo nel processo padre che aspetta semplicemente il figlio else wait(NULL); } exit(0); }