Løsningsforslag eksamen vår 2006 Operativsystemer og UNIX

Oppgave 1

a) emacs prog.bash&

b) mv ../info.txt .

c) chmod 770 info.txt

d) grep root /etc/passwd

e) ps aux | grep root | wc -l

f) os=`uname`

g) date -r info.txt +%s

Oppgave 2

a)

#! /bin/bash

maxTid=0
for fil in `find $1 -type f`
do
   sec=`date -r $fil +%s`
   if [ $sec -gt $maxTid ]
   then
        maxTid=$sec
   fi
done
echo "$maxTid"

b)

#! /bin/bash

if [ $# -ne 2 ]
then
    echo "Syntaks: $0 dato-fil til-dir"
    exit
fi

fraDir=$1
tilDir=$2
fotoKat="/home/hh/foto"

if [ ! -d $1 -o ! -x $1 -o ! -r $1 ]
then
    echo "$1 ikke dir eller kan ikke nås/skrives til"
    exit
fi

if [ ! -d $2 -o ! -x $2 -o ! -w $2 ]
then
    echo "$2 ikke dir eller kan ikke nås/skrives til"
    exit
fi

newestTime=`newest $fotoKat` # Sec siden 1970. Nyere filer skal kopieres
 
for fil in $fraDir/*
do
    if [ -f $fil -a -r $fil ]
    then
          fileTime=`date +%s -r $fil`   
          if [ $fileTime -gt $newestTime ]
          then
               echo "Kopierer $fil til $2"
               cp -p $fil $2
          fi
     fi
done

Oppgave 3

a) Man trenger en C-kompilator som man kompilerer kildekoden. Den resulterenede kildekoden kan da kjøres direkte. (man kan også trenge en linker for å linke den eksekverbare koden sammen med eventuelle eksterne bibliotek)

b) Man trenger en Java-kompilator som lager Java bytecode fra kildekoden. For å kunne kjøre programmet trenger man så en Java Virtual Machine (JVM).

c) Man trenger en bash-tolker, et program som leser og kjører bash-script, installert på maskinen. Deretter kan scriptet kjøres, uten at det er behov for kompilering.

d) Filen s.out vil være størst, fordi den også inneholder biblioteket. Filen d.out er mindre fordi den linkes dynamisk til biblioteket og trenger derfor ikke å inneholdet dette..

e) Det er paging-tabellen i MMU som hele tiden holder rede på hvor programmets sider er. CPU kan derfor bruke logiske adresser og disse blir oversatt av MMU til riktig fysisk adresse. Nåre page to flyttes inn igjen, oppdateres MMU-tabellen slik at logisk adresse fra CPU blir oversatt til riktig fysisk adresse når det skal hoppes til page to.

f) Du bør be om mer internminne. Når slike vindusprogrammer går så sagte at de er ubrukelige, skyldes det høyst sannsynlig at deler av RAM hele tiden må skyfles til virtuelt minne. En raskere CPU ville hjelpe noe, men selv om den gikk 2-3 ganger raskere, ville ikke det være nok. Størrelsen på harddisk er ikke et problem når programmer går sagte; med nok RAM er det stort sett bare ved oppstart av programmet at harddisken er aktiv.

g) IP-adressen er 115.43.12.3, MAC-adressen er 00:90:27:11:67:23 og netmask 255.255.254.0.

h) Netmasken sier at de 9 siste bit'ene i IP-adressen er hostnummeret og de 23 første er nettverket. De 23 første bitene i både 115.43.12.3 og 115.43.13.22 er de samme (det som skiller 12 og 13 er at 13 har en en'er som siste bit) og de er på samme nettverk. Pakker mellom dem vil derfor gå direkte.

i) Den viktigste forskjellen er at alle nodene i P2P- nettverket (eller ihvertfall mange av dem) er med på å lagre filene som skal distribueres. I et rent P2P-nettverk er også informasjonen om hvor filene ligger spredt rundt på nodene i nettverket, mens et hybrid P2P-nettverk har sentrale servere som har informasjonen om på hvilke noder filene ligger.

Oppgave 4

a)

#! /usr/bin/perl

open(PASSWD,"/etc/passwd");
open(TMP,">/tmp/passwd");

while(my $line = <PASSWD>)
  {
    my @info = split(":",$line);
    my $shell = $info[6];
    chomp($shell);
    if($shell eq "/bin/false" or $shell eq "/bin/bash")
      {
        print TMP $line;
      }
    else
      {
        #$info[6] = "/bin/bash"; # Alternativ
        #$line = join(":",@info);
        #print TMP "$line\n";
        print TMP "$info[0]:$info[1]:$info[2]:$info[3]:$info[4]:$info[5]:/bin/bash\n";
      }
  }

close(PASSWD);
close(TMP);
`mv /tmp/passwd /etc/passwd`;

b)

#! /bin/perl

$http = "http://www.gulesider.no/gsi/whiteSearch.do?etter=@ARGV";
open(TEL,"$lynx -source \"$http\"|");
while($line = <TEL>)
  {
    if($line =~ /RESULT ITEM START/)
      {
        while($line !~ /RESULT ITEM END/)
          {
            $line = <TEL>;
            $line =~ s/\&nbsp;/ /g;
            if($line =~ /(.*?)<\/b>/)
              {
                print "$1, ";
              }
            elsif($line =~ /(\d\d\d \d\d \d\d\d)/)
              {
                print "Mobil: $1 ";
              }
            elsif($line =~ /(\d\d \d\d \d\d \d\d)/)
              {
                print "Fast: $1 ";
              }
            elsif($line =~ /\d\d\d\d \w+/)
              {
                print "$line";
              }
          }
        print "\n";
      }
  }


Hårek Haugerud 2006-11-24