Umeå universitet
Teknisk-naturvetenskaplig fakultet
Institutionen för datavetenskap
Laboration 2
Laboration 2 går ut på att konstruera ett utskriftssystem,
dvs ett system som sköter en skrivarkö så att flera användare
på olika maskiner kan dela på en skrivare.
Specifikationen kan komma att ändras något under kursens första del.
OBS! På denna lab är det tillåtet att jobba två och två.
Systemet skall bestå av två program:
- En utskriftsklient, mprint, som tar filnamn som
parametrar och kopierar dessa till en speciell
spoolkatalog för att köas upp för utskrift.
mprint skall även klara av att visa och ta bort
element ur kön
- En utskriftdemon, mprintd, som tar filer ur kön
och skriver ut dem på en angiven enhet, tex stdout,
fil eller skrivare.
Utskriftsklienten skall ha följande egenskaper:
- Flera användare på olika maskiner (men samma maskintyp) skall
kunna skriva ut samtidigt
- Det ska vara möjligt att skriva ut en eller flera kopior av en fil,
vilket ska anges med en option
- Man ska kunna avläsa vilka filer som finns i kön och en användare
ska ha möjlighet att ta bort sina egna filer ur kön
- Filer som skickas till kön ska vara skyddade mot utskrift tills
dess hela filen finns i kön
- En fil som är under utskrift ska inte kunna raderas ifrån kön
- Om inget filnamn anges skall data läsas från stdin. Det
skall gå att skriva t.ex
mprint -n4
för att skriva ut fyra kopior av datat som läses
just från stdin
- Signalerna SIGINT, SIGQUIT, SIGHUP och
SIGTERM skall hanteras på ett korrekt sätt
Utskriftsdemonen skall ha följande egenskaper:
- Programmet skall uppfylla de villkor som ställs på en
riktig demon.
- Det skall finnas option för att inte koppla demonen loss
från terminalen
- Det skall gå att välja vilken fil eller enhet som utskriften
skickas till. Om demonen inte kopplar loss sig från terminalen
skall det även gå att skriva ut till stdout
- Signalerna SIGQUIT, SIGHUP och SIGTERM
skall hanteras på ett korrekt sätt. SIGINT har
i detta fall ej en fördefinerad betydelse utan kan användas
för dumpa statusinformation el. dyl.
Det går givetvis bra att även här hantera fler signaler.
Syntax
Kommandot mprint skall ha följande syntax:
mprint [ -q [queueno] ... | -r queueno [queueno] ... |
[ -n nocopies ] file1 [ [ -n nocopies ] file2] ... ]
mprint utan flagga läser indata från stdin och
skriver ut en kopia
Flaggan -n anger hur många kopior som skall skrivas ut. Basvärdet
är 1 kopia per fil. Observera att denna flagga kan specificeras flera
gånger
Flaggan -q specificerar kökontroll och skall följas av noll
eller flera könummer som extra argument
Flaggan -r tar bort filer ur och skall följas av ett
eller fler könummer som argument
Kommandot mprintd skall ha följande syntax:
mprintd [ -d ] [ -f file ]
mprintd utan flagg kopplar loss sig från terminalen och
skickar utskriften till förval enhet (device)
Flaggan -d gör så att demonen inte kopplar loss sig från
terminalen. Detta är nyttigt vid bla felsökning. Flaggan -d tar
inga argument
Flaggan -f specificerar vilken fil eller enhet som utskriften skall
skickas till. Om -d har angivits och bara ett minus ('-') anges som
filnamn skall utskriften skickas till stdout. Om första tecknet
i filnamnet är ett utropstecken skall resten av filnamnet ses om ett
kommando och data skall följdaktligen skickas (via en pipa) till
det kommandot. Titta på systemanropet popen
för mer information.
Implementation
Du kan använda två filer som innehåller information om
utskriftssystemet. En som innehåller det könummer som nästa
jobb ska få och en som innehåller information om alla filer
som ska skrivas ut. Dessa filer ska skyddas mot samtidig
användning av flera processer genom att använda låsfiler.
Låsfiler är filer som med sin blotta existens markerar att
en resurs är upptagen.
Ett sätt att skapa låsfiler på är att till systemanropet open
använda flaggorna O_EXCL och O_CREAT. Denna lösning är dock ej att
rekommendera om filerna ligger på ett filsystem av typ NFS (vilket de
kommer att göra!). En säkrare variant är att istället skapa en
låskatalog med systemanropet mkdir.
För att andra användare skall kunna skriva ut utan att alla köfiler
är skrivbara för alla (vilket ej är tillåtet här) så måste
utskriftsklienten exekvera med ditt användarid, i sk
"set-user-id"-läge. Detta görs enklast med kommandot chmod.
Vare sig utskriftsklienten eller demonen får lämna låsfiler
efter sig om de avslutas efter att ha mottagit en signal eller
råkat ut för något fel. Programmen skall givetvis också
så långt det är möjligt avsluta pågående filoperationer, så att
de inte genererar korrupta datafiler.
För att programmen skall fungera korrekt så måste varje möjlighet
till uppkomst av fel bevakas. Det betyder i klartext att man bla
måste kontrollera ALLA I/O-operationer, samt vidta åtgärder
när fel uppstår.
Programmen skall implementeras i C. Den körbara versionen
ska vara kompilerad för RS/6000.
Tips
Att korrekt tolka en kommandorad är inte helt enkelt. Funktionen
getopt hjälper dig en bit på vägen.
Eftersom ni inte har behörighet att skriva direkt till någon
skrivarenhet (printer device) så går det alldeles
utmärkt att använda /dev/null som förvald utskriftsenhet
Test
Den här labben är klassisk på flera sätt, däribland är den en
av de labbar som flest personer aldrig får godkänt på första
gången. Orsaken till detta är det är ganska många inte testar sina
program ordentligt.
Innan en labb lämnas in skall minst följande tester vara utförda:
- Olika användare (alltså inte bara dig själv!) kan använda systemet
samtidigt.
- En stresstest som testar minst 5 simultana operationer.
- Ovanstående två tester skall fungera för såväl utskrift som kökontroll
och borttagning av element ur kön.
- Kontroll att felsituationer hanteras korrekt: Tex felaktiga
kommandoflaggor, filnamn, könummer; misslyckad läsning och
skrivning av filer.
- Att programmet ger relevanta felmeddelanden. Meddelandet
"Over disk quota" för godtyckligt skrivfel är bra exempel på hur
det inte skall se ut.
Dåligt uttestade laborationer medför direkt längre rättningstider då
labrättaren har fullt upp med att testa era lösningar flera gånger.
Sista inlämningsdag 1994-10-28!
Författare:
Senast ändrad 1994-10-13 av mr@cs.umu.se