Oppgave 1
a) cp /tmp/scan.pl .
b) chmod 751 scan.pl
c) 3, 5 og 6
d)
tar xfz luckroot.tgz # pakker ut filen luckroot.tgz som er et gzip'et tar-arkiv # med kommandoen tar. x = extract, f = file, z = gunzip cd luckroot # Går til katalogen luckroot som tar lagde ./luckgo # Kjører programmet luckgo som tar la i denne katalogen
Oppgave 2
#! /bin/bash if [ $# -ne 1 ] then echo "Syntaks: $0 portnummer" # Eller portnavn.bash istedetfor $0 exit fi port=$1 while read navn portProto rest do if [ "$portProto" == "$port/tcp" ] then echo "TCP-tjenesten $navn er på port $port"; exit fi done < /etc/services lynx -source http://www.iana.org/assignments/port-numbers | while read navn portProto rest do if [ "$portProto" == "$port/tcp" ] then echo "IANA: TCP-tjenesten $navn er på port $port"; break fi done
Oppgave 3
a) (Time, finished, Proc nr, etc. ikke viktig)
Time 1 Proc 1 print 1 Time 2 Proc 2 start 1 Time 3 Proc 2 print 2 Time 4 Proc 1 echo 2 Time 5 Proc 2 exit 3 finished Proc 2 Time 5 CPUtime 3 Time 6 Proc 1 end 3 finished Proc 1 Time 6 CPUtime 3
b) Det finnes flere mulige resultater, avhengig av hvor i readylist en ny prosess legges:
Ny prosess sist i ready-list: Time 1 Proc 1 print 1 Time 2 Proc 2 fork 1 Time 3 Proc 1 echo 2 Time 4 Proc 3 fork 2 Time 5 Proc 2 fork 2 Time 6 Proc 1 end 3 Time 7 Proc 4 exit 3 Time 8 Proc 3 exit 3 Time 9 Proc 5 exit 3 Time 10 Proc 2 exit 3
Ny prosess først i ready-list: Time 1 Proc 1 print 1 Time 2 Proc 2 fork 1 Time 3 Proc 3 fork 2 Time 4 Proc 4 exit 3 Time 5 Proc 1 echo 2 Time 6 Proc 2 fork 2 Time 7 Proc 5 exit 3 Time 8 Proc 3 exit 3 Time 9 Proc 1 end 3 Time 10 Proc 2 exit 3
Ready-list sortert etter Proc-nummer: Time 1 Proc 1 print 1 Time 2 Proc 2 fork 1 Time 3 Proc 3 fork 2 Time 4 Proc 4 exit 3 Time 5 Proc 1 echo 2 Time 6 Proc 2 fork 2 Time 7 Proc 3 exit 3 Time 8 Proc 5 exit 3 Time 9 Proc 1 end 3 Time 10 Proc 2 exit 3
c)
Time 1 Proc 1 wait 1 Time 2 Proc 2 add 1 Time 3 Proc 1 critical 2 Time 4 Proc 2 wait 1 Time 5 Proc 1 critical 3 Time 6 Proc 1 signal 1 Time 7 Proc 2 crit 3 Time 8 Proc 1 stop 5 Time 9 Proc 2 crit 4 Time 10 Proc 2 signal 1 Time 11 Proc 2 exit 5
d) At en prosess venter i en while-løkke til en annen prosess er ferdig med et kritisk avsnitt. Prosessen vil da bruke CPU til å sjekke om og om igjen om ressursen den ønsker er ferdig og dermed sløse bort mye CPU-tid.
e) Kode som må fullføres av prosessen som utfører den uten at andre prosesser bruker samme felles ressurs.
f) Hvis filen /tmp/lockfile
eksisterer betyr det at en annen prosess skriver til
den felles filen og prosessen som ønsker å skrive står og venter helt til den
andre prosessen er ferdig og sletter /tmp/lockfile
. Da oppretter den ventende
prosessen filen på nytt for å sikre at ingen andre får tilgang.
Anta at en context switch skjer etter while-løkken er passert og rett før /tmp/lockfile
lages.
Hvis en annen prosess da kjører denne koden vil den også passer while-løkken og begge skrive samtidig.
Men det vil skje veldig sjelden og metoden gir i praksis en brukbar beskyttelse og mye bedre enn om
man overser problemet.
g) Algoritmene sørger for at mutual exclusion blir oppfylt, det er ikke mulig for noen av prosessene å komme samtidig inn i kritisk avsnitt, for prosessene har vært sitt flagg som den andre sjekker om er satt før den går inn i kritisk avsnitt. Men en context switch etter
flag[t] = true;for en prosess blir fatalt hvis den andre prosessen da prøver å gå inn i kritisk avsnitt og også utfører
flag[t] = true;for begge flaggene blir true og begge prosessene blir stående og spinne i while-løkken til evig tid......
Oppgave 4
a)
sub erTall() { if($_[0] =~ /^\d+$/) { if($_[0] > $_[1] and $_[0] < $_[2]) { return("OK"); } } return(); }
b)
sub portOK() { $max = 65536; ($portA,$portB) = split("-",$_[0]); if( erTall("$portA","0","$max") and erTall("$portB","0","$max") and $portB >= $portA) { return($portA,$portB); } return(0,0); }
c)
sub IPOK() { $max = 256; ($A,$B,$C,$D) = split('\.',$_[0]); if(erTall($A,-1,$max) and erTall($B,-1,$max) and erTall($C,-1,$max) and erTall($D,-1,$max)) { return("OK"); } return(); }
Oppgave 5
#! /bin/perl use IO::Socket::INET; if($#ARGV != 1) { die("Syntaks: scan IP minport-maxport\n"); } $host = $ARGV[0]; if(! IPOK($host)) { die("IP-adressn $host er ikke gyldig\n"); } ($portMin,$portMaks) = portOK($ARGV[1]); if($portMin == 0) { die("Port-angivelsen $ARGV[1] er ikke gyldig\n"); } for($port = $portMin; $port <= $portMaks; $port++) { if($socket = IO::Socket::INET->new(PeerAddr => $host,PeerPort => $port)) { $info = `s.bash $port`; chomp($info); print "$info og er åpen for tilkobling\n"; close($socket); } else { $closed++; } } print "Det var $closed porter som var lukket\n\n.";