Løsningsforslag Eksamen høst 2004 Operativsystemer og UNIX

Oppgave 1

a) mv /tmp/fil.txt .

b) wc -l /etc/group Eventuelt cat /etc/group | wc -l som kun gir antallet

c)

112 mark
120 sigmunds
fordi sort defalut sorterer alfabetisk og da kommer 11 før 78. Derimot ville sort -n IQ.txt | head -n 2 gitt
78 haugerud
112 mark

d) For å kunne skrive til en katalog (eller en fil) må rettigheten w være satt.

e) For å kunne kopiere noe til en katalog, må katalogen kunne aksesseres (f. eks. gå dit med cd) og da må x-rettigheten være satt.

f) chmod 300 dir da settes x og w, begge må være satt. r er kun nødvendig for å lese filer i katalogen.

g) Med cp settes et nytt tidsstempel på filen som kopieres mens cp -p bevarer tidsstempelet (og andre egenskaper). -p står for preserve.

Oppgave 2

#! /bin/bash

if [ $# -ne 2 ]; then
        echo "Syntax: $0 file directory"
        exit
fi

times=10
fil=$1
dir=$2

if [ ! -f $fil ]; then
        echo "$fil er ikke en fil"
        exit
fi

if [ ! -r $fil ]; then
        echo "Kan ikke lese $fil"
        exit
fi

if [ ! -d $dir ]; then
        echo "$dir er ikke en katalog"
        exit
fi

if [ ! -w $dir -o ! -x $dir ]; then
        echo "Kan ikke skrive til katalog $dir"
        exit
fi

navn=`basename $fil`

if [ -f $dir/$navn ]; then
    (( i = $times - 1 ))
    while [ $i -gt 0 ]
    do
      if [ -f $dir/$navn.$i ]; then
          (( ipp = $i + 1 ))
          cp -p $dir/$navn.$i $dir/$navn.$ipp
      fi
      (( i = $i - 1 ))
    done
    cp -p $dir/$navn $dir/$navn.1
elif [ -e $dir/$navn ]; then
    echo "$dir/$navn eksisterer, men er ikke en fil"
    exit
fi

cp -p $fil $dir

Oppgave 3

a) $2^{32}$ byte (= 4294967296 = 4 x 1073741824 = 4 x 1G) = 4 Giga byte

b) Når det fysiske minnet (RAM) er oppbrukt, begynner programmene å bruke virtuelt minne på harddisken (swapping). Det går veldig mye saktere å lese til og fra disk enn til og fra internminne.

c)

  1. C++
  2. Java
  3. Perl
  4. bash

d) Java er plattformuavhengig og Java byte-kode kan generelt kjøres på alle plattformer uansett hvilken plattform den er kompilert på:

Java-program kompilert på Windows Linux Solaris
Kjører på Windows X X X
Kjører på Linux X X X
Kjører på Solaris X X X

e) Et kompilert C-program er maskinkode som kun kan kjøre på arkitekturen det er kompilert for. Makinkoden kommuniserer med OS, så den vil også være OS-avhengig.

C-program kompilert på Windows Linux Solaris
Kjører på Windows X    
Kjører på Linux   X  
Kjører på Solaris     X

f) Uten hjelp fra hardware kan ikke en slik prosess tvinges til å avbrytes. En hardware timer sender med jevne mellomrom et interrupt som gjør at neste instruksjon er et hopp til kjernekode som gir OS kontrollen slik at det kan vurdere hvilken prosess som skal slippe til neste gang.

g) Hvis et vanlig brukerprogram kunne switche til superusermodus, ville det kunne gjøre hvilken som helst instruksjon og manipulere på hvilken som helst del av minne og dermed kunne overta kontrollen over CPU'en. Moderne OS bruker en maskininstruksjon (trap for x86) som switcher til superusermodus og hopper til kjernekode i samme operasjon.

Oppgave 4

#! /bin/perl
use strict;
use IO::Socket::INET;

my $file = "/tmp/chat";
my $host = $ARGV[0];
$host or die "Oppgi navn på server!";
my $port = 9002; # Portnummer på server som client skal kobles til

my $socket = IO::Socket::INET->new("$host:$port")
or die "Kan ikke koble til $host på port $port\n";
my $pid = fork();
if(! $pid)
{                         # De to neste linjene er ikke påkrevet men nyttige
     $socket->close();         # I denne prosessen skal socketen ikke brukes
     `touch $file`;            # I fall den ikke finnes ellers feilmelding
     `xterm -e tail -f $file`;
     exit;
}

my $name = `whoami`;
my $host = `hostname`;
chomp($name);
chomp($host);

my $prompt = "$name\@$host> ";
print "$prompt";
while (my $line = <STDIN>)
{
    last if($line =~ /^\s*quit\s*$/);
    $socket->send("$prompt$line");
    addLine($file,"$prompt$line");
    print "$prompt";
}
$socket->close(); # Avslutter forbindelsen

sub addLine()
{
    my ($fil,$line) = @_;
    if(open(FIL,">>$fil"))
    {
        print FIL $line;
        close(FIL);
    }
    else
    {
        print STDERR "Kan ikke skrive til $fil\n";
    }
}


Hårek Haugerud 2004-12-03