Umu logo 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:

  1. 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

  2. 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:

Utskriftsdemonen skall ha följande egenskaper:

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:

  1. Olika användare (alltså inte bara dig själv!) kan använda systemet samtidigt.
  2. En stresstest som testar minst 5 simultana operationer.
  3. Ovanstående två tester skall fungera för såväl utskrift som kökontroll och borttagning av element ur kön.
  4. Kontroll att felsituationer hanteras korrekt: Tex felaktiga kommandoflaggor, filnamn, könummer; misslyckad läsning och skrivning av filer.
  5. 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