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.
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.
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.
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.
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.
Ett försättsblad ska skrivas under och häftas ihop med labrapporten.
testmish {user|filepath}
./testmish ~/edu/sysprog/lab5/mish
fprintf(stderr, "mish%% "); fflush(stderr);Detta för att undvika en del eventuellt gnäll från testprogrammet.
redirect
ska inte skriva över existerande
filer. Om stdout ska omdirigeras till en fil, och filen redan finns,
ska redirect
returnera med en felkod, och errno
satt till lämpligt värde.
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]