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.
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.
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%
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.
\t
) mellan storleken och
entry-texten. Det ska inte vara några mellanslag på en rad (såvida inte
entry-texten innehåller mellanslag).
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.
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.
-o
som anger att storleken för en
katalog bara beror på de entrys som finns i katalogen, och att
storleken på underkataloger inte ska räknas in. Se man-sidan för du för
mer information.
-h
som anger att inga
felmeddelanden ska skrivas ut om en katalog inte kan öppnas, eller om
ett argument till programmet inte finns (som du uppför sig
normalt, alltså).
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]