Løsningsforslag Eksamen høst 2005 Operativsystemer og UNIX(LO141A)
NB! Ikke korrekturlest, muligens feil......

Oppgave 1

a) chmod 644 foto.jpg

b) mv foto.jpg ~/www/foto

c) scp /etc/passwd s123456@nix.iu.hio.no:~

d) ssh nix.iu.hio.no

e) Default sender cat readme.txt innholdet av filen til STDOUT som vil si terminalvinduet. I den første kommandoen blir output omdirigert til /dev/null som er et bunnløst sluk der alt forsvinner og kommandoen resulterer i at ingenting synlig skjer. Den andre kommandoen gjør at innholdet av filen vises i terminalvinduet.

f) Filen :home:hh:prosjekt flyttes til katalogen /home/hh/prosjekt og blir der lagret under navnet :home:hh:prosjekt.

g) date +%F_%T -r sendt.log

Oppgave 2

#! /bin/bash

cd /root/ftester
if [ -f sendt.log ]
then
    $date=`date +%F_%T -r sendt.log`
    mv sendt.log sendt.log.$date
fi

date > sendt.log
/root/ftester/fsend
scp sendt.log root@firewall.iu.hio.no:/root/ftester

a)

#! /bin/bash

cd /root/ftester
ssh -f server.iu.hio.no /root/ftester/ftaimot
/root/firewall.rc

if [ -f sendt.log ]
then
    /bin/rm sendt.log
fi

ssh -f shadowfax.iu.hio.no /root/ftester/frun.bash

while [ ! -f sendt.log ]
do
    echo "Venter på at testen skal bli ferdig på shadowfax"
    sleep 5
done

echo "sendt.log mottatt fra shadowfax"

scp root@server.iu.hio.no:/root/ftester/mottatt.log .
./freport sendt.log mottatt.log > report.txt

Oppgave 3

a) Siden det er tidkrevende simuleringer, bør man velge et relativt raskt språk med tanke på CPU-intensive oppgaver. Både C og C++ er da gode alternativer. Java er ikke like hurtig, men akseptabelt. Objektorientering er generelt meget nyttig når man programmerer simuleringer, C++ og Java har da et fortrinn i forhold til C. Perl er mindre effektivt i slike sammenhenger, men ikke helt utelukket.

b) For å gjøre en såpass enkel oppgave, kan man bruke cp og chmod direkte i et bash-script. Det finnes også mange andre script-språk som er like enkle. Dette går også helt greit med Perl, men man må skrive noen få tegn ekstra i forhold til et bash-script, man er ikke like "nær" kommandolinjen. Man kan også skrive C-program som gjør dette, men det krever litt mer koding og det gir ingen vesentlig tidsgevinst.

c) Til en slik oppgave er Perl ideelt, da det er raskt og enkelt å skrive kode som trekker ut informasjon fra tekstfiler. Det tar mer tid og kode å skrive det samme i C eller Java og tester viser at Perl nesten er på høyde med C's hurtighet når det gjelder å lese og manipulere informasjon i tekstfiler. Det er også mulig å gjøre dette i et scriptspråk som bash, men det vil gå vesentlig saktere enn Perl-programmet.

d) Når et slikt OS fordeler CPU-tid mellom flere samtidige prosesser, lar det hver prosess kjøre en tilmålt timeslice i en Round Robin-kø. Ved å tildele forskjellig størrelse på timeslicene, vil tildelt CPU-tid kunne prioriteres fra mye til lite (det er også mulig å sette opp egne køer for spesielt viktige prosesser, som må kjøre ferdig før andre slipper til).

e) Hvis prosessene bruker semaforen riktig, vil den første prosessen som når det kritiske avsnittet der den felles variabelen brukes, redusere semaforens verdi fra 1 til 0 og gå inn i kritisk avsnitt. Hvis den avbrytes av en contextswitch før den er ferdig, vil neste prosess nå sitt kritiske avsnitt. Den senker semaforen til -1, tas ut av RR-køen og legges i semaforens kø. Slik går det også med neste prosess når den når fram; semaforen senkes da til -2. Etterhvert som prossessene blir ferdig med kritisk avsnitt, økes semaforen med 1 og neste prosess i køen slipper til. Til slutt er alle tre ferdige og semaforen får igjen verdien 1. Dette er helt avhengig av at prosessene bruker semaforene riktig ved å kalle på wait før kritisk avsnitt og signal etter kritisk avsnitt.

f) Denne metoden virker aldri, fordi den lager /tmp/lockfile før den går inn i en evig løkke. Der vil den stå for alltid, fordi ingen prosess vil komme til kodelinjen der /tmp/lockfile fjernes. For at dette skulle virke, måtte filen lages etter while-løkken.

g) Algoritmene sørger for at mutual exclusion blir oppfylt, det er ikke mulig for noen av prosessene å komme samtidig 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)

#! /bin/perl

open(NY,"ny.txt");
while($line = <NY>)
  {
    addLine($line);
  }
close(NY);

sub addLine()
  {
    $add = $_[0];
    open(DATA,"data.txt");
    while($data = <DATA>)
      {
        if($data eq $add)
          {
            close(DATA);
            return;
          }
      }
    close(DATA);

    open(DATA,">>data.txt");
    print DATA $add;
    close(DATA);
  }

b)

#! /bin/perl
 use strict; # Variabler må da deklareres med my
 use IO::Socket::INET;

 my $DBfile = "PTP.txt";
 my $serverPort = 9020;
 my $socket;
 # Oppretter nå et socket-objekt
 $socket = IO::Socket::INET->new(LocalPort => $serverPort,
                                 Listen    => 5)
    or die "Can't start tcp-server at port $serverPort ($!)\n";

 my $socketConnection; # Koblingen til client
 my ($answer,$fileString,$line);

 while ($socketConnection = $socket->accept())        # Venter på tilkobling
   {
     my $client = $socketConnection->peerhost();
     print "Received connection from $client.\n";

     open(DB,$DBfile);
     while(my $line = <DB>)
           {
             print $socketConnection $line;
           }
     close(DB);

     close($socketConnection); # Kobler ned forbindelsen for å vente på en ny
     print "Connection closed.\n\n";
   }


Hårek Haugerud 2005-12-05