Navigationskarta Insitutitionen för Datavetenskap Umeå Universitet

Laboration 5: minishell

Introduktion

Ett shell (kommandoskal) är det program som körs då du öppnar en ny xterm, eller loggar in på en maskin med telnet/rsh/ssh. Det skriver ut en prompt och väntar på kommandon. I den här laborationen ska du implementera ett minimalt shell, mish. Det ska klara av exekvering av kommandon och program, pipor mellan program och omdirigering av standard input och standard output.

Det här är en klassisk laboration på den här kursen. Den har hängt med åtminstone sedan hösten 1995 (i lite olika skepnader). Varför? Jo, det är helt enkelt en väldigt bra laboration där man lär sig mycket. I år har vi dock gjort en del ändringar i laborationen.

Din uppgift

Du ska som sagt implementera ett minimalt shell som ska klara av exekvering av kommandon och program, att koppla pipor mellan program, samt omdirigering av standard input och standard output.

Till din hjälp finns i filen parser.c, med tillhörande parser.h, en parser (en rutin som kodar av och tolkar om något) som parsar en kommandorad och delar upp den i kommandon separerade av pipor. Den tar en kommandorad och en pekare till en array av command som argument, och returnerar en int (antalet kommandon). Parsern fyller arrayen av command med info om den kommandorad som parsern fick som argument. command har följande utseende:

typedef struct command_t
{
	char **argv;
	int argc;
	char *infile;
	char *outfile;
	int internal;
} command;

mish ska dessutom hantera signalen SIGINT och på den avbryta exekveringen av alla uppstartade program, skriva ut en ny prompt, och efter det vänta på nya kommandon. Detta kan lösas på två sätt, och det enklaste är att ha en array innehållande alla uppstartade programs PID, och iterera igenom den arrayen och sända signalen SIGINT till vart och ett av programmen. Signalhanteringsfunktionerna ska finnas i filerna sighant.c och sighant.h.

mish ska alltså skriva ut en prompt, läsa in en kommandorad, parsa den med hjälp av parsern och därefter exekvera alla kommandon som parsern returnerar. Vid exekveringen ska det hantera argument, koppla ihop alla kommandon med pipor och hantera all omdirigering av input / output. Om läsning av nytt kommando ger EOF (dvs. användaren trycker Ctrl-D) så ska shellet avsluta.

Struktur

För att underlätta struktureringen av ditt program ska du bl.a. implementera funktionerna som finns i filen execute.h som du ska inkludera i ditt shell.

Exekvering av kommandon och program

mish ska kunna exekvera externa program samt interna kommandon. För varje externt program ska en process skapas som exekverar det programmet. Interna kommandon ska exekveras av huvudprocessen. mish ska vänta tills alla externa kommandon exekverat klart innan en ny prompt skrivs ut. För att förenkla lite grann antar vi att en kommandorad antingen består av en sekvens av externa kommandon eller ett internt kommando. Du behöver alltså inte bekymra dig om pipor mellan interna och externa kommandon, ej heller omdirigering av standard input och output för interna kommandon. De interna kommandon som ska implementeras är cd som ska byta working directory, samt echo som skriver ut alla sina argument på standard output.

Environment-variabeln PATH ska användas för att lokalisera de externa programmen som ska exekveras. Detta betyder inte att du själv ska leta reda på det externa programmet och köra det. Titta på man-sidan för execvp så får du veta vad som menas.

Filer

Alla filer ska finnas i katalogen ~/edu/sysprog/lab5/ och vara läsbara för oss labrättare. De ska heta mish.c, mish.h, execute.c, execute.h, parser.c, parser.h, sighant.c, sighant.h samt Makefile (ja, du måste använda en Makefile). Vad som ska finnas i dem hoppas vi är självklart. Din lösning ska gå att kompilera, köra och rätta utan att vi ska behöva kopiera några andra filer.

Försättsblad

Ett försättsblad ska skrivas under och häftas ihop med labrapporten.

Tips, hjälp och saker att tänka på

Sista inlämningsdag: Kl. 23:59 den 13:e oktober 1999.

Inlämnat detta sista datum ska vara ett på Solaris-maskiner exekverbart mish-program, en välskriven laborationsrapport (i pappersformat) samt välkommenterad kod (tillsammans med labrapporten).

[an error occurred while processing this directive]