Oppgave 1
I denne oppgaven antas det at man kjører bash på en Linux-maskin.
a) Gi en kommando som flytter filen /tmp/fil.txt
til katalogen du står i
b) Gi en kommando som gir antall linjer i filen /etc/group
c) Gitt følgende
cube$ cat IQ.txt 134 toreo 78 haugerud 120 sigmunds 112 mark cube$ sort IQ.txt | head -n 2Hva blir output fra
sort
-kommandoen?
d) Forklar kort feilmeldingen fra kommandoen cp
:
$ whoami hh $ ls -l d--x------ 2 hh hh 4096 Nov 28 12:16 dir -rw-r--r-- 1 hh hh 0 Nov 28 12:16 fil $ cp fil dir cp: cannot create regular file `dir/fil': Permission denied
e) Kommandosekvensen fortsettes med
$ chmod 200 dir $ ls -l d-w------- 2 hh hh 4096 Nov 28 12:16 dir -rw-r--r-- 1 hh hh 0 Nov 28 12:16 fil $ cp fil dir cp: cannot stat `dir/fil': Permission deniedForklar kort feilmeldingen fra kommandoen
cp
.
f) I fortsettelsen av eksempelet i forrige deloppgave, gi en kommando
som setter det minmum av rettigheter katalogen dir
må ha for at cp fil dir
skal kunne utføres uten feilmeldinger.
g) Studer følgende eksempel:
$ ls -l drwx------ 2 hh hh 4096 Nov 28 12:24 dir -rw-r--r-- 1 hh hh 0 Nov 28 12:16 fil -rw-r--r-- 1 hh hh 0 Nov 28 13:01 fil.txt $ cp fil dir $ cp -p fil.txt dir $ ls -l dir -rw-r--r-- 1 hh hh 0 Nov 28 13:03 fil -rw-r--r-- 1 hh hh 0 Nov 28 13:01 fil.txtForklar ut fra dette kort hva som er forskjellen på kommandoene
cp
og
cp -p
.
Oppgave 2
Det er lurt å gjøre de 4 siste deloppgavene i oppgave 1 før du gjør
denne oppgaven.
Ofte er det nyttig å ta vare på eldre versjoner av filer, for eksempel et program under
utvikling eller loggfiler.
Men om man ikke fjerner de eldste versjonene, kan man risikere at disken fylles opp.
I denne oppgaven skal du lage et bash-script med navn rotate
som skal kopiere
en fil (gitt som argument 1) til en katalog (gitt som argument 2). Hvis det fra før
ligger en fil med samme navn i denne katalogen (en tidligere versjon) skal det lages
en kopi av denne filen med versjonsnummer 1 og eventuelle andre versjoner roteres slik
at alle får et høyere versjonsnummer. Inntil 10 gamle versjoner av filen skal lagres.
Noen eksempler viser best hvordan scriptet skal virke om man utfører
$ rotate fil.txt dir
Følgende finnes i dir | Etter rotate skal følgende finnes |
Ingen fil med navn fil.txt | fil.txt |
fil.txt | fil.txt (ny) og fil.txt.1 (het før fil.txt) |
fil.txt, fil.txt.1 | fil.txt (ny) og fil.txt.1 (før fil.txt), fil.txt.2 (før fil.txt.1) |
fil.txt, fil.txt.1, fil.txt.2 | fil.txt, fil.txt.1, fil.txt.2, fil.txt.3 |
fil.txt, fil.txt.1, ... ,fil.txt.9 | fil.txt, fil.txt.1, ...,fil.txt.10 |
fil.txt, fil.txt.1, ... ,fil.txt.10 | fil.txt, fil.txt.1, ...,fil.txt.10 |
fil.txt.10
ikke bevares, slik at det maksimalt
skal lagres 10 gamle versjoner. Filen som angis i første argument kan være gitt med
en path før filnavnet som i
$ rotate /tmp/fil.txt dirScriptet skal avlutte med en passende feilmelding hvis
Oppgave 3
a) En av fordelene med de nye 64-bits x64 prosessorene og Itanium er at de kan adressere mer RAM. Hvor mange byte internminne kan man maksimalt adressere med et 32-bits adresseregister som de fleste av dagens 32-bits prosessorer har?
b) Du kjører Jbuilder og et par andre programmer som krever mye internminne. Når du bruker disse programmene kjører de etterhvert veldig sakte og du hører at harddisken brukes hele tidene, selvom programmene ikke lagrer eller leser filer. Hva kan dette skyldes? Forklar kort.
c) Anta at du skal lage et CPU-intensivt program som skal utføre en stor matematisk beregning. Du vurderer å bruke språkene bash, C++, Java og Perl. Ranger antatt hastighet for disse programmene fra 1 til 4 med 1 som hurtigste og 4 som sakteste.
d) Anta at du har en Linux og en Windows maskin som kjøer på samme type
x86-hardware og en Sun Solaris-maskin som kjører på sparc. Alle har installert Java.
I følgende tabell er det et kryss i første rute fordi et Java-program kompilert
på Windows-maskinen kan kjøres på Windowsmaskinen. Fyll ut tilsvarende der du mener
det skal være kryss.
Java-program kompilert på | Windows | Linux | Solaris |
Kjører på Windows | X | ||
Kjører på Linux | |||
Kjører på Solaris |
e) Anta samme maskiner som i forrige deloppgave, men nå har alle en C-kompilator.
Siden et C-program som er kompilert på
Windows-maskinen vil kjøre på Windows-maskinen, er det fylt ut et kryss i
første rute. Fyll ut tilsvarende der du mener det skal være kryss.
C-program kompilert på | Windows | Linux | Solaris |
Kjører på Windows | X | ||
Kjører på Linux | |||
Kjører på Solaris |
f) Et brukerprogram kjører under et multitasking OS på en maskin med bare en CPU. I maskinkoden til programmet er det en evig løkke som gjør at den samme koden kjøres om og om igjen. Hvordan sørger OS for at andre prosesser slipper til i CPU-løkken? Forklar kort.
g) Når et brukerprogram skal lese en fil, må modusbit switches til superusermodus for at kjernekode skal utføres. Anta at dette ble gjort med følgende maskin-instruksjoner i brukerprogrammet:
switchToSuperuserModus JMP readfilehvor det i den andre instruksjonen hoppes til kjernekoden. Hva er problemet med denne løsningen og hvordan løses det i moderene OS? Forklar kort.
Oppgave 4
a) Lag en Perl subrutine addLine()
som tar to argumenter. Det første er et
filnavn og det andre er en tekststreng. Subrutinene skal åpne filen, legge
til tekststrengen på slutten av filen og lukke filen igjen. Hvis det ikke lykkes å
åpne filen for skriving, skal den skrive ut en feilmelding om det til STDERR.
Du skal bruke use strict;
.
b) I denne deloppgaven skal du skrive klient-delen av et Perl chat-program som
skal kunne brukes mellom to vilkårlige Unix-maskiner på Internett.
Koden for server-delen heter
server
og ser slik ut:
#! /bin/perl use strict; use IO::Socket::INET; my $serverPort = 9002; my $socket = IO::Socket::INET->new(LocalPort => $serverPort, Reuse => 1, Listen => 5) or die "Kan ikke starte chat-server på port $serverPort!\n"; while (my $socketConnection = $socket->accept()) { while(my $line = <$socketConnection>) { addLine("/tmp/chat",$line); } $socketConnection->close(); }Koden for subrutinen
addLine()
er den fra oppgave a) og er tenkt
inkludert til slutt i server.
Begge de to maskinene det skal chattes mellom skal kjøre en slik server.
En typisk chat mellom brukeren haugerud
på host rex
og
brukeren os
på host cube
kan se slik ut for
haugerud
på rex
:
rex$ ./server& rex$ ./client cube haugerud@rex> Hei! haugerud@rex> Er du der? haugerud@rex> OK. Jeg må stikke. haugerud@rex> Med quit haugerud@rex> quit rex$og for
os
på host cube
:
cube$ ./server& cube$ ./client rex os@cube> Jada... os@cube> Greit, hvordan avslutter man? os@cube> OK os@cube> quit cube$Begge vil når de starter
client
få opp et xterm-vindu som fortløpende viser det som begge taster inn
slik:
haugerud@rex> Hei! haugerud@rex> Er du der? os@cube> Jada... haugerud@rex> OK. Jeg må stikke. os@cube> Greit, hvordan avslutter man? haugerud@rex> Med quit os@cube> OKDette skal gjennomføres ved at programmet
client
(som du skal skrive) åpner en
socket på port 9002 til serveren. Navnet på serveren som client
skal koble seg til skal bli gitt som første argument.
Deretter sender client
hver linje som
brukeren taster inn over denne socketen til server. I tillegg skriver client hver linje
til filen /tmp/chat
med subrutinen addLine()
fra oppgave a). Ikke skriv
inn addLine()
på nytt. Dette gjør at filen /tmp/chat
på begge
serverene vil fylles opp med alle linjene som de to brukerene taster inn.
De to chat'erne ser alt som skrives inn ved å kjøre kommandoen
tail -f /tmp/chati et terminalvindu. Da vises linje for linje av det som legges til filen
/tmp/chat
.
Scriptet client
skal sørge for følgende:
use strict;
xterm -e tail -f /tmp/chat
for å vise det som skrives. Men programmet må først gjøre en fork()
og utføre kommandoen i child, ellers vil client henge på denne kommandoen
addLine()
til filen /tmp/chat
quit
og eventuelt blanke, TAB eller lignende før eller etter
-SLUTT-