Om te interageren met het besturingssysteem, gaat een programma system calls uitvoeren. Dit zijn speciale oproepen naar het besturingssysteem, zoals open, write, etc. Deze kunnen per besturingssysteem anders zijn; je C-library zal achter de schermen de standaard C-functies vertalen naar de juiste system calls voor het besturingssysteem dat je aan het uitvoeren bent (en waarvoor de specifieke C-library die je gebruikt bedoeld is).

Met het strace-commando kan je kijken welke system calls een programma allemaal uitvoert. (Om dit te doen maakt het achter de schermen gebruik van debuggerfunctionaliteit.)

Als je dit interessant vindt, bekijk zeker eens de man-page van strace, die heeft een heel aantal coole en interessante features en opties. In deze oefening gaan we ons beperken tot de gewone werking, met slechts 1 speciale optie. We gaan dus strace uitvoeren met als argumenten het programma dat we willen tracen, gevolgd door eventuele opties voor het programma dat we willen tracen. (Zoals je kan zien in de manpage: opties voor strace zelf komen dus voor het programma-argument.)

We beginnen met iets simpels, we gaan kijken welke system calls ls -lh /usr/bin allemaal uitvoert achter de schermen op Linux. Je kan dat zelf al eens in je terminal bekijken: strace ls -lh /usr/bin.

Nu, zoals je misschien hebt gemerkt, zit de uitvoer van strace tussen de uitvoer van het programma, wat niet zo handig is in ons geval. Met de -o optie kan je die output naar een bestand redirecten, om er daarna andere acties op te doen.

Probeer alvast eens om op je systeem de system-call output van ls /bin met strace en diens -o optie naar /tmp/my_strace_ls te schrijven. Je wil uiteraard niet lastig gevallen worden door de output van ls, dus redirect die output naar het speciale bestand /dev/null. (Dit is een bestand dat, als je er iets naar schrijft, dit gewoon negeert.)

Voor de volgende Dodona-oefeningen voorzien we zelf in de huidige directory een bestand om van te starten, zodat het makkelijker is om te kijken of je oplossing juist of fout is. Vertrek voor de volgende oefeningen dan ook steeds van het bestand my_strace_ls, wat dus onze lokale kopie is van een echte uitvoer van strace.

  1. We willen enkel de lijnen overhouden die een systeemoproep bevatten. We gaan er even van uit dat die lijnen beginnen met een alfanumeriek woord. Filter die lijnen er alvast uit (en laat die nu gewoon op standard output verschijnen).

  2. Kijk eens naar het formaat van zo een lijn met een systeemoproep in strace. Print de 3 system calls die het meest opgeroepen worden, en sorteer die system calls alfabetisch. Bouw hiervoor verder op opgave 1.

  3. Geef een gesorteerde lijst van alle unieke system calls die ls doet. (Dus elke system call komt ten hoogste eenmaal voor in de uitvoer, die gesorteerd is.)

  4. De system calls hebben net als gewone functieoproepen in C een terugkeerwaarde. Bekijk opnieuw hoe de structuur van de uitvoer van strace er uit ziet, en geef de lijst van alle terugkeerwaarden. (Deze moet voor de rest niet gefilterd of gesorteerd zijn.)

  5. Een negatieve waarde geeft aan dat er een fout opgetreden is bij die system call (bijvoorbeeld: je probeert een bestand te openen dat niet bestaat). Geef alle systeemoproepen die een fout veroorzaakten (de volledige systeemoproep, inclusief argumenten en fouten).

  6. Zoals je ziet, kan strace bij sommige syscalls een onderscheid maken tussen verschillende fouten die de kernel kan teruggeven, en geeft hierbij dan zowel de korte C-stijl foutnaam, als een langere omschrijving. Geef de meest-voorkomende fout-uitleg (dus enkel de uitleg, zonder de haakjes er rond). Je m