Navigationskarta Insitutitionen för Datavetenskap Umeå Universitet

Laboration 3: 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. Här på CS börjar man normalt med 5 MB, får efter ett tag 10 MB, och slutligen 20 MB. Men som vi alla vet så räcker inte detta särskilt långt. 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.

Din uppgift

Du ska skriva ett program kallat mdu som uppför sig ungefär som UNIX-programmet du. Utan argument ska det uppföra sig som kommandot du -k. Syntaxen för mdu ska vara följande:

mdu [-a] [-s] [dir [dir ...] ]

mdu ska gå igenom en eller flera katalogstrukturer på ett sätt liknande du, räkna ihop storlekarna på alla entrys i kataloger, och skriva ut hur mycket utrymme en katalog tar upp. Givet inga argument startar mdu i aktuell arbetskatalog, och jobbar sig nedåt i katalogstrukturen. Man kan även ange en eller flera startkataloger, så att mdu börjar räkna på ett annat ställe än nuvarande arbetskatalog. Om argumentet -a anges ska storleken på varje fil skrivas ut, inte bara sammanräkningen av alla entrys i katalogen. Anges argumentet -s ska bara en summering av alla kataloger skrivas ut, inte varje katalogs storlek för sig. Anges både -a och -s är det -s som gäller, precis som "riktiga" du gör.

Exempel

Några exempel på hur körningar kan se ut:

ath@peppar% ./mdu
113     ./.netscape/nsmail
3       ./.netscape/news
...
1165    ./DBD-Oracle-1.03
52857   .
ath@peppar% ./mdu /opt/Vim/4.5
492     /opt/Vim/4.5/bin
34      /opt/Vim/4.5/man/man1
35      /opt/Vim/4.5/man
825     /opt/Vim/4.5/lib/vim
826     /opt/Vim/4.5/lib
1354    /opt/Vim/4.5
ath@peppar% ./mdu /opt/Vim/4.5 /opt/Pine/4.05
492     /opt/Vim/4.5/bin
34      /opt/Vim/4.5/man/man1
35      /opt/Vim/4.5/man
825     /opt/Vim/4.5/lib/vim
826     /opt/Vim/4.5/lib
1354    /opt/Vim/4.5
13244   /opt/Pine/4.05/bin
22      /opt/Pine/4.05/man/man1
23      /opt/Pine/4.05/man
13268   /opt/Pine/4.05
ath@peppar% ./mdu -s /opt/Vim/4.5 /opt/Pine/4.05
1354    /opt/Vim/4.5
13268   /opt/Pine/4.05
ath@peppar% ./mdu -a /opt/Vim/4.5
453     /opt/Vim/4.5/bin/vim
1       /opt/Vim/4.5/bin/gvim
11      /opt/Vim/4.5/bin/xxd
26      /opt/Vim/4.5/bin/ctags.vim
492     /opt/Vim/4.5/bin
9       /opt/Vim/4.5/man/man1/vim.1
17      /opt/Vim/4.5/man/man1/ctags.1
7       /opt/Vim/4.5/man/man1/xxd.1
34      /opt/Vim/4.5/man/man1
35      /opt/Vim/4.5/man
94      /opt/Vim/4.5/lib/vim/vim_40.txt
3       /opt/Vim/4.5/lib/vim/vim_ami.txt
2       /opt/Vim/4.5/lib/vim/vim_arch.txt
31      /opt/Vim/4.5/lib/vim/vim_diff.txt
4       /opt/Vim/4.5/lib/vim/vim_digr.txt
15      /opt/Vim/4.5/lib/vim/vim_dos.txt
22      /opt/Vim/4.5/lib/vim/vim_gui.txt
54      /opt/Vim/4.5/lib/vim/vim_help.txt
39      /opt/Vim/4.5/lib/vim/vim_idx.txt
7       /opt/Vim/4.5/lib/vim/vim_kcc.txt
1       /opt/Vim/4.5/lib/vim/vim_mac.txt
3       /opt/Vim/4.5/lib/vim/vim_menu.txt
2       /opt/Vim/4.5/lib/vim/vim_mint.txt
6       /opt/Vim/4.5/lib/vim/vim_os2.txt
418     /opt/Vim/4.5/lib/vim/vim_ref.txt
7       /opt/Vim/4.5/lib/vim/vim_rlh.txt
12      /opt/Vim/4.5/lib/vim/vim_tips.txt
2       /opt/Vim/4.5/lib/vim/vim_unix.txt
16      /opt/Vim/4.5/lib/vim/vim_w32.txt
22      /opt/Vim/4.5/lib/vim/vim_win.txt
64      /opt/Vim/4.5/lib/vim/vim_tags
825     /opt/Vim/4.5/lib/vim
826     /opt/Vim/4.5/lib
1354    /opt/Vim/4.5
ath@peppar% ./mdu -s /opt/Vim/4.5
1354    /opt/Vim/4.5
ath@peppar% ./mdu -sa /opt/Vim/4.5
1354    /opt/Vim/4.5
ath@peppar% ./mdu ~gunnar/INBOX
mdu: cannot open /Home/staff/gunnar/INBOX: Permission denied
ath@peppar% ./mdu ~ath/life
mdu: cannot open /Home/staff/ath/life: No such file or directory
ath@peppar% 

Tips och saker att tänka på

Ta en titt på man-sidorna för opendir och lstat. Titta även på man-sidan för getopt som ska användas för att hantera optioner till programmet.

Filer

Alla filer ska finnas i katalogen ~/edu/sysprog/lab3/ och vara läsbara för oss labrättare. De ska heta mdu.c, mdu.h (om nödvändigt) samt mdu. Vad som ska finnas i dem är ganska 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.

Överkurs

Känner du att laborationen är för lätt kan du försöka dig på att implementera någon/några av nedanstående features. OBS! Se dock till att grunden i ditt program fungerar. Om t.ex. argumentet -a slutar fungera då man använder argumentet -o så är det bättre att strunta i att implementera -o.

Sista inlämningsdag: Kl. 23:59 den 27 september 1999.

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

[an error occurred while processing this directive]