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.";