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);
}

About OpenProgrammers

Programmatore per passione. Mi piace condividere qualsiasi idea o informazione utile, per questo motivo ho realizzato il blog.