Uke 6 - C og assembly-programmering; bash scripting

Oppgaver til mandag 3. - fredag 7. feb

Først noen oppgaver relatert til C og assembly-programmering fra ukens forelesning; det er viktig å jobbet med dette i praksis for å få en grundigere forståelse. Dette er datamaskinarkitektur i praksis: hvordan utføres høynivåkode egentlig i en datamaskin? Deretter er det fokus på scripting i Linux-delen denne uken. Script av økende vanskelighetsgrad og etterhvert noen ganske avanserte shell-script. Hvis man sikter mot karakterene A og B, bør man få med seg ukens utfordringer!

Når du er ferdig med de obligatoriske oppgavene denne uken, kan oblig1 leveres inn. Meld gruppen inn i en av de eksisterende os-gruppene i Canvas og lever inn der. Start fra toppen (os1) og velg første ledige gruppe. Det anbefales å være to eller tre på gruppen, men inntil fem er mulig hvis dere er en sammensveiset gruppe som gjerne vil fortsette å jobbe sammen.

  1. (Oblig) Kompiler C-programmet Hello world fra forelesningen på data2500 med gcc hello.c og kjør det med
    $ ./a.out
    
    Kompiler det så med gcc hello.c -o hello. Hvordan kan du nå også kjøre programmet? Hvis du ikke har programmert i C før, kan starten av denne C-tutorial være nyttig.
  2. (Oblig) Kompiler sum.c fra forlesningen og sjekk at du får riktig svar. Kompiler så sammen sumMain.c og as.s fra samme forelesning med
    gcc sumMain.c as.s
    
    Endre så assembly-koden as.s slik at løkken gjennomløpes en gang til og sjekk at du får svaret 10. Hva er likheten mellom koden i as.s og maskinkoden i oppgave 5 i uke 5?
  3. Kopier as.s til en ny fil as2.s og endre assembly-koden slik at den utfører
    S = 0;
    for(i=1;i < 3;i++)
    {
       S = S + 2;
    }
    
    istedet. Lag gjerne en ny versjon av sum.c også slik at du er sikker på at as2.s virker som den skal.
  4. (Oblig) Lag en fil esum.c som ser slik ut:
    int sum()
    {
    int S=0,i;
    for(i=1; i < 4; i++)
         {
    	S = S + i;
         }
    return(S);
    }
    
    Kompiler den deretter sammen med sumMain.c med
    gcc sumMain.c esum.c
    
    og kjør programmet. Hva er likheten mellom as.s og esum.c? Kompiler så esum.c med
    gcc -S esum.c
    
    Hva er likeheten mellom as.s og den resulterende filen esum.s med tanke på hva de totalt sett utfører?

    Klarer du å se noen likheter mellom koden i esum.s og as.s? Endre koden i esum.s slik at løkken går en gang til og gir 10 som resultat.

  5. Ukens utfordring nr. 1: Programmer inn en linje maskinkode i sum-programmet som ligger i DigitalWorks slik at resultatet av summen som ligger i R3 skrives til adresse 3 i RAM. Sjekk etterpå at resultatet ble lagret rett sted ved å gå inn i RAM-modulen og se. Du kan finne riktig instruksjon i avsnittet 3.10 Løkker og branch control. Ville det være mulig å skrive til adresse 2 og 12 bare ved hjelp av de eksistrende instruksjonene?
  6. Finn ut hvilke grupper du selv tilhører på din private s-server (med intel3-innlogging).
  7. (Oblig) På din private s-server (med intel3-innlogging), utfør en Linux-kommando som bruker grep til å skrive ut den linjen i /etc/passwd som inneholder ditt brukernavn, uten å bruke ditt brukernavn eksplisitt.
  8. (Oblig) Skriv et shell-script som skriver ut verdien av den globale variabelen SHELL hvis den er satt og gir melding om at den er udefinert hvis den ikke er satt.
  9. (Oblig) Lag et bash-script med navn publiser som setter rettighetene til alle filer i ~/www slik at eier kun kan lese og skrive, mens alle andre kun kan lese dem. I tillegg skal scriptet gi tilsvarende rettigheter for alle filer i ~/www/bilder. Hvis mappene ~/www og ~/www/bilder ikke eksisterer, skal de opprettes og gis alle rettigheter for eier, men kun lese- og kjørerettigheter for alle andre. Om det finnes andre kataloger i ~/www skal disse ikke endre rettigheter, heller ikke underkataloger og filer i disse.
  10. Lag et bash-script count.bash som skriver ut en oversikt over hvor mange linker, filer og kataloger det finnes i katalogen scriptet kjøres fra og i alle dens underkataloger. Bruker du doble parenteser rundt aritmetiske uttrykk (( x++ )) kan du bruke samme syntaks som i Java (og sløyfe $ foran variabelnavn). Hint: Test kommandoene ls -R, tree -if og find . og se om noen av dem kan brukes i scriptet.
  11. (Oblig) Gjør først selv et forsøk på å lage bash-scriptet count.bash i forrige oppgave. Copy-paste så oppgaveteksten til Sikt KI-chat og test ut om det gir samme resultat når du tester det ut på en mappe som inneholder en god del linker, filer og mapper. Er det noen forskjell på resultatene? Isåfall, hvilket script er helt korrekt?
  12. Ukens utfordring nr. 2: Lag en versjon av publiser-scriptet i spørsmål 6.9 som antar at ~/www eksisterer og gir
    1. alle rettigheter for eier, men kun lese- og kjørerettigheter for alle andre for ~/www og alle undermapper
    2. lese og skriverettigheter for eier, men kun leserettigheter for alle andre for alle filer i ~/www og dens undermapper
    Filer i ~/www og undermapper som allerede har kjørerettigheter skal beholde det. Hint: Se opsjonen X til chmod i manual-siden.
  13. Ukens utfordring nr. 3: Lag en versjon av scriptet i forrige spørsmål som gir rettigheter som spesifisert der, uavhengig av hvilke rettigheter de hadde fra før.
  14. (Oblig) Skriv et shell-script som tar en streng som argument og skriver ut en melding som avgjør om dette er en fil og om i såfall den er angitt med absolutt eller relativ path (om en relativ path er angitt til filen, skal scriptet sjekke om den finnes relativt til der scriptet kjøres fra. Merk: hvis man gjør en test på en fil i et script, utføres testen fra den mappen som scriptet starter i.). (hint: Testen if [ -f $fil ] ; then slår til om $fil er en fil. Bruk konstruksjonen ${variabel:offset:length} for å trekke ut ett tegn fra en streng. Eventuelt cut -c 1.)
  15. (Oblig) Utvid scriptet i forrige oppgave slik at brukeren kan angi flere enn en fil. Gjør det ved å gå igjennom argumentene ett for ett og utføre det samme for hvert argument.
  16. Ukens utfordring nr. 4: Skriv et bash-script rename som endrer filendelse på filer i katalogen det kjøres. Brukeren angir en filendelse og hva den skal endres til med to argumenter. Hvis man bruker rename som følger:
    $ ./rename wav mp3
    Endrer fil.wav til fil.mp3
    Endrer fil2.wav til fil2.mp3
    
    skal alle filer i katalogen som har filendelse wav endres til mp3. En opplysning om hver endring skal gis som i eksempelet. Hvis brukeren ikke angir to argumenter skal scriptet avslutte og oppgi riktig syntaks. Hvis det ikke finnes filer med den filendelsen brukeren angir som første argument, skal scriptet gi en melding om det.
  17. Ukens utfordring nr. 5: Bruk Linux-kommandoen rename (/usr/bin/rename) til å utføre det samme som scriptet i forrige oppgave (utskriften blir litt forskjellig). Prøv å først gjøre en kommando som sier hvilke endringer som blir gjort og så en som gjør endringene.
  18. Lag et bash-script "finnOrd" som tar ett ord som argument og går igjennom alle filer i katalogen scriptet blir utført fra og i alle underkataloger, og finner linjer i disse filene som inneholder dette ordet. For hver fil som inneholder ordet, skal scriptet gi meldingen:
    ########### Fant "ord" i fil "filnavn" i følgende linje(r):
    
    Og så skrive ut alle linjene (Hint: bruk find . og grep).
  19. Lag et shellscript som når det kjøres på data2500 gir omtrent tilsvarende som output:
    Linux data2500 4.4.0-101-generic #124-Ubuntu SMP Fri Nov 10 18:29:59 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
    cpu MHz		: 2294.248
    MemTotal:        8175152 kB
    model name	: Common KVM processor
    /etc/lsb-release:DISTRIB_CODENAME=xenial
    /etc/os-release:VERSION_CODENAME=xenial
    /etc/os-release:UBUNTU_CODENAME=xenial
    /etc/lsb-release:DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
    
    Hint: Test ut kommandoen uname og se på innholdet i /proc/meminfo, /proc/cpuinfo og /etc/*release.
  20. Hvis du har en Windows laptop, installer Windows Terminal om du ikke allerede har gjort det (er default på Windows 11). En enkel måte er å gå til Microsoft Store fra taskbar og så søke etter Windows Terminal. Installer deretter Windows Subsystem for Linux (WSL) som gir deg et ekte Linux-OS som gjør det mye bedre å koble deg opp mot Oslomets Linux server. Følg for eksempel en guide som https://learn.microsoft.com/en-us/windows/wsl/install. Deretter kan du åpne bash-vinduer i Windows Terminal og derfra logge deg inn til data2500 og s-serveren med ssh.
  21. (Oblig) Dette er ukens OS-konkurranse oppgave. For å gjøre oppgaven skal du følge instruksjonene nedenfor.

    Gå inn på Canvas der du skal ha bli tilordent en s-gruppe. Det er en gruppe som heter noe sånt som s135 hvis du er tilordnet enkeltstudentgruppe nr 135; det skal kun være en student pr gruppe (de vanlige gruppene med flere studenter heter os?? hvor ?? er gruppenummeret). (Istedet for å lete igjennom alle de 341 gruppene, klikk på grupper i venstremenyen i Canvas, før du går inn i et kurs, da vil du få opp kun de gruppene du er medlem av.) Du kan da få tilgang til en egen server gjennom passordet som ligger i en annonsering i denne s-gruppen på Canvas. Hvis du f.eks. er i gruppe s135 kan du logge inn med (svar yes og ok på alle spørsmål):

    $ ssh -p 5135 s135@intel3.vlab.cs.oslomet.no
    
    s135@intel3.vlab.cs.oslomet.no's password: 
    
    s135@os5135:~$ 
    
    hvor du skriver passordet som står i announcment i s135 gruppen. Merk at hvis du bruker putty må du legge inn at portnummeret er 5135 og ikke det standard ssh-portnummeret 22 (135 + 5000 = 5135 skal kun brukes for student s135, er du i student-gruppe s1 er portnummeret 1 + 5000 = 5001, etc.).

    Oppgaven går ut på at det inne på hjemme-mappen til din s-bruker nå er lagt til en ny fil som du skal prøve å finne. Problemet er at det nå er 1000 mapper i tre nivåer med 10 mapper på hvert nivå og det er derfor ikke så enkelt å finne filen. I tillegg er det lagt inn 10 andre filer i filsystemet som ikke inneholder den rette koden; noe som er opplagt når du ser innholdet av disse filene. Og etter at du har funnet den riktige filen er det ikke så lett å lese den. Men filen inneholder et ord med 10 tegn. For å sjekke at du har funnet det rette ordet, skriv strengen med 10 tegn inn på siden os.php og du får beskjed om du har skrevet riktig. I tilegg blir du da med på konkurransen om å finne denne koden fortest mulig!

    NB! Det er viktig at hvert medlem på gruppen gjør oppgaven på egen s-server. Hvert medlem må finne sitt ord og skrive det inn i rapporten. Skriv inn ordene sammen med s-nummeret det tilhører. Skriv i tillegg resultatet inn på os.php siden for å få oppgaven godkjent som oblig.