Oppgave 1
I denne oppgaven skal du i delspørsmålene der du blir bedt om å gi
en kommando, angi en kommando på en linje, slik du ville ha tastet den inn
til bash på en Linux-maskin fra tastaturet (du svarer for eksempel
mkdir kat
hvis du blir spurt: Opprett en katalog med navn kat).
a) Gi en kommando som gir hvilken katalog du står i.
b) Gi en kommando som legger navnet på katalogen du står i inn i
variabelen $pwd
.
c) Gi en kommando som sender output fra programmet regn
til
filen res.txt
og som dropper alle feilmeldinger.
d) Hvilke brukere kan lese innholdet av filen /tmp/secret.txt
?
-rw-r----- 1 haugerud drift 9 Sep 5 15:53 /tmp/secret.txt
Studer manualsiden for kommandoen uniq
:
NAME uniq - remove duplicate lines from a sorted file SYNOPSIS uniq [OPTION]... [INPUT [OUTPUT]] DESCRIPTION Discard all but one of successive identical lines from INPUT (or standard input), writing to OUTPUT (or standard output). -c, --count prefix lines by the number of occurrences -d, --repeated only print duplicate lines -D, --all-repeated only print all duplicate lines -f, --skip-fields=N avoid comparing the first N fields -t, --separator=SEP use SEParator to delimit fields -u, --unique only print unique lines -W, --check-fields=N compare no more than N fields in lines
e)
Gitt at du har følgende sorterte fil med navn test
en to toAngi hvordan du kan bruke
uniq
med opsjoner på filen test
slik at output blir
1 en 2 to
f) Anta du står i en katalog med fire underkataloger som inneholder tekstversjonen av alle Shakespeares verker og som ser slik ut når du lister dem:
$ ls -l totalt 4 drwx------ 2 haugerud drift 512 2006-11-21 15:32 comedies drwx------ 2 haugerud drift 512 2006-11-21 15:32 histories drwx------ 2 haugerud drift 512 2006-11-21 15:32 poetry drwx------ 2 haugerud drift 512 2006-11-21 15:32 tragedies $ ls -l poetry/ totalt 265 -rw------- 1 haugerud drift 14366 1992-08-29 07:45 loverscomplaint -rw------- 1 haugerud drift 84700 1992-08-29 07:46 rapeoflucrece -rw------- 1 haugerud drift 95662 1992-08-29 07:43 sonnets -rw------- 1 haugerud drift 18954 1992-08-29 07:46 various -rw------- 1 haugerud drift 54390 1992-08-29 07:46 venusandadonisTilsvarende inneholder de tre andre uderkatalogene tekstfiler med de andre verkene. Gi en Linux-kommando som legger alle disse tekstfilene etter hverandre i samme tekstfil med navn
/tmp/alle.txt
.
g) Linux-kommandoen tr
leser fra standard input og kan brukes til å skifte ut tegn i tekster. Følgende kommando
bytter ut alle sekvenser av tegn som ikke er bokstaver med ett linjeskift:
$ echo "Hei, ja og Hallo dere..." | tr -cs A-Za-z '\n' Hei ja og Hallo dereDermed overføres en setning til ord fordelt linje for linje. Kommandoen
tr
kan også brukes til å
bytte store bokstaver med små
$ echo "HEisaNN" | tr A-Z a-z heisannLag en sammensatt kommando som gjør begge deler ved å fylle inn det som mangler i kommandoen nedenfor og slik at resultatet blir som angitt:
$ echo "Hei, ja og Hallo dere..." | ANGI DIN KOMMANDO hei ja og hallo dere
h)
Bruk det du lærte fra forrige deloppgave (g) og filen /tmp/alle.txt
fra deloppgaven (f) til å
lage en enlinjers Linux-kommando som lager en liste over de 5 ordene som Shakespeare brukte mest når han
skrev sine verker. Output fra kommandoen skal være på formen
29854 the 27554 and 23357 i 21075 to 18520 ofeller ihvertfall inneholde samme informasjon. Resultatet betyr at Shakespeare brukte ordet "the" 29854 ganger og "and" 27554 ganger.
i)
Gitt at du har følgende sorterte fil med navn pass
ord1:x:3:etter ord2:x:3:av root:x:4:nei root:x:5:ikke ulik:x:1:resten
Bruk uniq
med opsjoner på filen pass
slik at output blir
root:x:4:nei root:x:5:ikke
j)
Bruk uniq
med opsjoner på filen pass
slik at output blir
ord1:x:3:etter ord2:x:3:av
Oppgave 2
Brukerne på en Unix-maskin er vanligvis definert i filen /etc/passwd
.
Starten på denne filen kan se ut som følger
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh ftp:x:99:99:Anonymous FTP:/local/iu/ftp:/bin/sync snort:x:10004:1005:Snort IDS:/var/log/snort:/bin/false nobody4:x:65534:65534:SunOS 4.x Nobody:/:/bin/sync mroot:x:0:0:Tcsh Root account:/local/iu:/bin/bash studwww:x:24:24:web server daemon:/:/bin/bash snort:x:10044:1005:Snort IDS:/var/log/snort:/bin/falseSkriv et bash-script med navn
check.bash
som kontroller
/etc/passwd
og melder ifra om følgende:
sort -n -t: -k3 /etc/passwd
sorterer passordfilen
numerisk med hensyn på 3. kolonne, UID.
Anvendt på passordfilen over skal scriptet gi tilsvarende:
$ check.bash Scriptet kjører på rex OS: Linux -rw-r--r-- 1 root root 140317 Nov 20 15:02 /etc/passwd Antall brukere 2100 /etc/passwd root (root) har uid = 0 mroot (Tcsh Root account) har uid = 0 Flere tilfeller av samme brukernavn: snort:x:10004:1005:Snort IDS:/var/log/snort:/bin/false snort:x:10044:1005:Snort IDS:/var/log/snort:/bin/false Flere tilfeller av samme UID: mroot:x:0:0:Tcsh Root account:/local/iu:/bin/bash root:x:0:0:root:/root:/bin/bash nobody4:x:65534:65534:SunOS 4.x Nobody:/:/bin/sync nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
Oppgave 3
a) Forklar kort hvordan to Java-tråder som kjører på en Linux eller Windows-PC med én CPU multithreades eller kjøres samtidig.
b) Forklar kort hva som er fordelen med en applikasjon med flere tråder som kjører på en maskin med flere enn én CPU, sammenlignet med en tradisjonell applikasjon med bare en tråd. Ta ikke med i betraktningen fordeler som er like relevante om de kjørte på en maskin med bare én CPU.
c) En maskin med én CPU skal kjøre to prosesser. Vil alltid multitasking være raskere når man tenker på den total tiden som går før begge prosesser er ferdig, eller kan det tenkes noe tilfelle der singletasking ville vært raskere? Ved først å la den ene prosessen kjøre ferdig og så den andre. Forklar kort.
d) I en Java-tråd er følgende variabler deklarert:
float sum[] = new float[2]; public static float total[] = new float[2];og de brukes i trådens run-metode slik
total[0] += 1.0; sum[0] += 1.0;Hvis to slike tråder kjører samtidig, er det noen grunn til å serialisere trådene og hvordan kan det isåfall gjøres. Forklar kort.
e) Anta at et Perl-program som kan startes fra web bruker følgende metode for å unngå at to brukere skriver samtidig til en fil:
`touch /tmp/lockfile`; # Lager /tmp/lockfile while(-f /tmp/lockfile) {} # skriver til en felles fil `rm /tmp/lockfile`; # Fjerner /tmp/lockfileVil denne metoden alltid virke? Forklar kort.
f) Forklar kort hvordan semaforer implementert i OS hindrer at flere enn en prosess eller tråd er inne i kritisk avsnitt samtidig.
g) Hvilke numeriske verdier vil en semafor S
initialisert til 1 kunne
ha under normal bruk?
h) I din egen Java-applikasjon med flere tråder, implementerer du en semafor med metoden
public void wait(){ S--; if ( S < 0 ){ // Setter tråden til å vente i en kø }og en
signal()
metode som øker den felles variabelen S
og eventuelt
tar tråden ut av køen. Hvis trådene dine
bruker wait()
og signal()
riktig, vil dette alltid hindre at trådene ikke
går inn i kritisk avsnitt samtidig når du kjører på et multitasking OS? Vil systemet
alltid virke slik du ønsker? Forklar kort.
i) Anta at en prosess bestemmer seg for å vinne kappløpet om en
felles ressurs og kaller signal(S)
fem ganger før den går inn
i kritisk avsnitt med wait(S)
. Klarer den å vinne kappløpet?
Diskuter kort om denne strategien er fornuftig for prosessen.
Oppgave 4
a) Du er lei av å få spørsmål fra kryssord av typen "Vet du om et dyr på
5 bokstaver som begynner på ti og slutter på r?" fra din svigermor.
Derfor vil du skrive et lite Perl-program kryss.pl
som slår opp i tekstfilen /usr/share/dict/bokmal
. Denne filen
inneholder 545665 norske ord som er alfabetisk sortert og har ett ord på hver linje.
Skriv dette Perl-programmet slik at mønsteret for det ukjente ordet gis som
argument til programmet med punktum '.' for å angi de ukjente bokstavene. Det skal i bruk
se slik ut:
$ kryss.pl ti..r tider tiger timer tinerHvis programmet ikke gis nøyaktig ett argument, skal det avsluttes med en passende feilmelding.
b)
På linuxmaskinen rex.iu.hio.no
starter du følgende Perl-server
og lar den stå og kjøre:
#! /usr/bin/perl use IO::Socket::INET; $socket = IO::Socket::INET->new(LocalPort=>9449,Listen=>5); while ($newsocket = $socket->accept()) { $string = <$newsocket>; print $newsocket "Mottok $string"; close($newsocket); }Du eksperimenterer litt med serveren og prøver å skrive inn et par URL'er i en browser på en annen maskin. Dette gir følgende:
URL skrevet i browser | Output i browser-vindu |
http://rex.iu.hio.no:9449/noetekst | Mottok GET /noetekst HTTP/1.1 |
http://rex.iu.hio.no:9449/..et..s. | Mottok GET /..et..s. HTTP/1.1 |
Bruk dette og koden du skrev i forrige deloppgave til å lage en kryssordserver som kan brukes fra hvilken som helst browser og som eksempelvis gir
URL skrevet i browser | Output i browser-vindu |
http://rex.iu.hio.no:9449/n.t..g | nattog |
nyting | |
nyttig |
helt tilsvarende Perl-programmet i forrige deloppgave (bare send vanlig tekst til browseren, du trenger ikke sende HTML, det virker likevel).
c)
Utvid programmet kryss.pl
i deloppgave a) til å kunne lete etter
alle muligheter i to ord som krysser hverandre og hvor den felles
bokstaven er ukjent og kalles X, slik som på figuren.
Ved kjøring av programmet
finnX.pl
for å finne mulige
ord for problemet i figuren, kan de to ukjente ordene angis som to
argumenter og output se slik ut:
$finnX.pl m..X.n .lX..l Match for bokstav X=y menyen flydel flygel Match for bokstav X=u misunn plural Match for bokstav X=o masomn masovn moloen moroen flomål floral globalDu trenger ikke å kontrollere antall argumenter.