Institutionen för datavetenskap Umeå Universitet

Laboration 1, mdu


Introduktion

För att hindra användare från att fylla hårddiskar med en massa skräp, får varje användare maximalt lagra en viss mängd data (eller filer) i sin hemkatalog. Men som vi alla vet så har man alltid för lite utrymme kvar. Så man blir ibland tvungen att rensa bort filer som man inte längre använder. När man ska göra denna rensning kan det vara bra att på ett enkelt sätt kunna ta reda på hur mycket man egentligen har lagrat, och var. Här kommer denna laboration in. Du ska skriva ett program som hjälper till med detta.

Det huvudsakliga syftet med denna laboration är att öva på rekursion, få lite mer övning på stränghantering, att ni ska få bekanta er lite med filer och kataloger i UNIX, och att ni ska få lära er effektiv hantering av kommandoradsargument till program.

Laborationen ska lösas enskilt.

Din uppgift

Skriv ett program som söker igenom en katalogstruktur och beräknar hur mycket plats på hårddisken som den upptar. Programmet ska startas med följande kommandorad:

mdu [-a|-s] [ dir1 ...]

Alla katalogträd som anges ska traverseras i given ordning. Om ingen rot-katalog alls anges ska nuvarande katalog (".") användas För varje underkatalog som programmet stöter på ska en rad skrivas ut. Den raden ska börja med ett heltal som anger hur många kilobyte (1024 bytes) som katalogen innehåller följt av en tab och därefter den absoluta sökvägen till katalogen utan avslutande "slash". Detta och ingenting annat ska skrivas ut på stdout. Alla eventuella felmeddelanden ska därför skrivas ut på stderr.

Flaggan -s gör att mdu bara skriver ut summan för de kataloger som angavs på kommandoraden, dvs storleken på underkatalogerna skrivs inte ut.

Om flaggan -a skickas till programmet så ska dessutom utrymmet som allokerats för alla filer som påträffats skrivas ut. Se exemplen för mer information om hur kommandoradsargumenten fungerar.

Observera att det oavsett hur programmet anropats inte är storleken på filerna i katalogerna som ska användas i beräkningarna, utan antalet 512b-block som allokerats. Se mansidan för lstat för hur man tar reda på det värdet för en någon fil. För att få ett korrekt resultat så måste 512b-blocken först summeras, sedan delas med två för att få fram antalet kilobyte. (Tänk en katalog med många filer där varje fil bara har allokerats ett 512b-block).

Block allokerade för katalogerna "." samt ".." ska inte räknas med i summan. Om en länk påträffas så ska den räknas som en fil. Ni ska inte följa några länkar.

Det finns tre begränsningar på hur er lösning får se ut.

  1. Använd inte globala variabler.
  2. Programmet måste använda sig av funktionen getopt för att ta hand om kommandorads-flaggor (-s, -a).
  3. Ni får inte använda funktionen ftw på den här laborationen.

Filer

Alla filer som behövs för att kompilera och köra er lösning ska finnas i ~/edu/5DV004/lab1/ med följande underkataloger: src/, report/ och bin/.

Rapport

Ni ska skriva en välskriven laborationsrapport som beskriver er lösning. Se följande länk för några riktlinjer för rapporten. http://www8.cs.umu.se/information/rapportguide.html

Inlämningsdatum

Senast kl. 13:00 måndagen den 19 april 2010 ska rapporten vara inlämnad i kursens labblåda på plan 4 i MIT-huset.

Tips och trix

  • Två funktioner som behövs för att göra detta program är opendir och lstat. Läs man-sidorna och i boken för att få mer information om dessa.
  • Traversera inte ner i katalogerna "." och ".."!
  • Det finns redan ett liknande program som heter du. Titta gärna på man- sidorna för det programmet och kör det på olika kataloger.
  • Testa gärna att skicka vidare output från ditt program till xdu och se vad som händer: ./mdu | xdu
  • Se till att fixa rättigheterna på edu/ katalogen innan inlämning.

Exempel

Så här kan det se ut när man kör programmet:
peppar:/pkg/ytalk> ~/bin/mdu
78      ./3.3.0/bin
2       ./3.3.0/etc
15      ./3.3.0/man/man1
16      ./3.3.0/man
97      ./3.3.0
102     .

peppar:~/bin> ./mdu /pkg/ytalk/ 78 /pkg/ytalk/3.3.0/bin 2 /pkg/ytalk/3.3.0/etc 15 /pkg/ytalk/3.3.0/man/man1 16 /pkg/ytalk/3.3.0/man 97 /pkg/ytalk/3.3.0 102 /pkg/ytalk/
peppar:~> bin/mdu /pkg/ytalk /pkg/xv 78 /pkg/ytalk/3.3.0/bin 2 /pkg/ytalk/3.3.0/etc 15 /pkg/ytalk/3.3.0/man/man1 16 /pkg/ytalk/3.3.0/man 97 /pkg/ytalk/3.3.0 102 /pkg/ytalk 1075 /pkg/xv/3.10a-jumbo-patches-20050501/bin 3609 /pkg/xv/3.10a-jumbo-patches-20050501/lib/xv 3610 /pkg/xv/3.10a-jumbo-patches-20050501/lib 13 /pkg/xv/3.10a-jumbo-patches-20050501/man/man1 14 /pkg/xv/3.10a-jumbo-patches-20050501/man 4700 /pkg/xv/3.10a-jumbo-patches-20050501 2 /pkg/xv/bin.ray 4710 /pkg/xv
peppar:~> bin/mdu -s /pkg/ytalk /pkg/xv 102 /pkg/ytalk 4710 /pkg/xv
peppar:~> bin/mdu -a /pkg/ytalk 1 /pkg/ytalk/bin 1 /pkg/ytalk/etc 1 /pkg/ytalk/man 77 /pkg/ytalk/3.3.0/bin/ytalk 78 /pkg/ytalk/3.3.0/bin 1 /pkg/ytalk/3.3.0/etc/ytalkrc 2 /pkg/ytalk/3.3.0/etc 14 /pkg/ytalk/3.3.0/man/man1/ytalk.1 15 /pkg/ytalk/3.3.0/man/man1 16 /pkg/ytalk/3.3.0/man 97 /pkg/ytalk/3.3.0 1 /pkg/ytalk/DESCRIPTION 102 /pkg/ytalk
peppar:~> bin/mdu ~emanuel/Mail /Home/staff/emanuel/Mail: Permission denied

http://www.cs.umu.se/kurser/5DV004/VT10/labbar/lab1.html
Ansvarig för sidan: Mikael Rännar
Senast ändrad 2010-03-29