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 sigmundsfordi 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)
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)
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";
}
}