Übungen Betriebssysteme (BS)

U0 – Erste Schritte in C

Alwin Berger

🚀 by Decker

Organisatorisches: Übungsaufgaben

  • Aufgabenblätter im Moodle
  • Übungsvorbesprechungsfolien ebenfalls unter dieser URL
  • Lösungsvorschläge werden in der Übung präsentiert
  • Notwendig für Studienleistung:
    • mindestens 50% der Punkte in beiden Aufgabenblöcken (je Blatt 10 Punkte + ggf. Sonderpunkte)
    • 1. Block: A0, A1, A2 → Summe mindestens 15 Punkte
    • 2. Block: A3, A4, A5 → Summe mindestens 15 Punkte

Bestehen der Studienleistung ist Voraussetzung für die Klausurteilnahme!

Organisatorisches: Abgaben

  • Theoriefragen und praktische Programmieraufgaben
  • Bearbeitung in Dreiergruppen (Ausnahme: A0)
    • Gruppenmitglieder sollten (müssen aber nicht) in derselben TÜ angemeldet sein.
    • Hilfestellung: HelpDesk
  • Abgabe über AsSESS
  • Abgabetermin abhängig von Woche der Übung:
    • W1 – Übungstermin in geraden KW -> Mittwoch 23:59 in der Woche nach Ausgabe der Aufgabe
      Aufgabe A0: Übung U0 in KW16, Abgabe Mi. 23.04.2025 23:59
    • W2 – Übungstermin in ungeraden KW -> Montag 14:00, direkt vor der ersten W1 Übung
      Aufgabe A0: Übung U0 in KW17, Abgabe Mo. 28.04.2024 14:00

Organisatorisches: Kommunikation

  • Wir haben keine Telegram-Gruppe!

  • Die Fachschaft Informatik hat aber ggf. eine in der wir nicht sind.

  • Für verbindliche Antworten gibt es den Matrix-Helpdesk

UNIX-Benutzerumgebung

  • Umgebung, Terminal, Shell
  • UNIX-Kommandos
  • GNU Compiler Collection (gcc)

Benutzerumgebung

Diese Eigenschaften machen (u.a.) einen UNIX-Account aus:

  • Benutzername
  • Identifikation (User-ID und Group-IDs)
  • Home-Directory
  • Eingestellte Login-Shell

Terminal

  • “Kommandozeile”
  • Früher: dedizierte Endgeräte zur Kommunikation mit Zentralrechner
  • Heute: Terminalemulation (z.B. Konsole, gnome-terminal)

images/Televideo925Terminal.jpg
Ein Physisches Terminal

Terminal Demo

Live Demo

Terminal-Sonderzeichen

  • Einige Zeichen haben unter UNIX besondere Bedeutung
  • Funktionen: u.a.
    • Korrektur von Tippfehlern (<Backspace> / <Ctrl>+U)
    • Bildschirmausgabe anhalten/fortsetzen (<Ctrl>+S / <Ctrl>+Q)
    • Laufende Programm abbrechen oder pausieren (<Ctrl>+C / <Ctrl>+Z)
    • End Of File senden (<Ctrl>+D)
    • Anzeige leeren (<Ctrl>+L)
  • Zuordnung Zeichen ⇔ Funktion leider nicht einheitlich
  • Kann mit einem Kommando (stty(1)) ausgegeben und verändert werden

Auf deutschen Tastaturen: <Strg> statt <Ctrl>

UNIX-Kommandointerpreter: Shell

  • Meist stehen verschiedene Shells zur Verfügung:
    • sh
    • bash
    • zsh
    • fish
    • pwsh
  • Auf GNU-Systemen gebräuchlich: bash
  • Beim Öffnen eines Terminals startet die ausgewählte Login-Shell
  • Wechsel der Login-Shell: chsh(1)

Aufbau eines UNIX-Kommandos

ls -l --all mein_ordner

Aufrufe von UNIX-Kommandos bestehen aus …

  1. Kommandoname
    • Eigentlich: Vollständiger Pfad zu einer ausführbaren Datei: z.B. /bin/ls
    • In der Umgebungsvariablen PATH stehen alle Pfade, in denen nach Kommandos gesucht werden soll
    • Die Pfade in PATH werden durch einen Doppelpunkt : getrennt
    • daher kann man normalerweise ls schreiben statt /bin/ls

Aufbau eines UNIX-Kommandos

ls -l --all mein_ordner

Aufrufe von UNIX-Kommandos bestehen aus …

  1. einer Reihe von Optionen und Argumenten
    • Abtrennung Kommandoname/Optionen/Argumente durch Leerzeichen oder Tabulatoren
    • Optionen sind meist einzelne Buchstaben mit einem vorangestellten „-“ (Minuszeichen) (z.B. „ls -l“)
    • Oft gibt es auch „lange“ Optionen, bestehend aus Worten mit zwei vorangestellten „-“
    • Nach vielen Optionen muss ein Argument folgen
    • Argumente sind häufig Dateinamen, die von einem Kommando verarbeitet werden

UNIX-Kommandos

  • man-Pages
  • Dateisystem
  • Benutzer
  • Prozesse
  • Diverse Werkzeuge
  • Texteditoren

man-Pages

  • Aufgeteilt in verschiedene Sections (mehr Infos: man man)
  1. Kommandos
  2. Systemaufrufe
  3. C-Bibliotheksfunktionen
  4. Dateiformate (spezielle Datenstrukturen etc.)
  5. Verschiedenes (z.B. IP, GPL, Zeichensätze, …)
  • teilweise mehrdeutig: printf(1) vs. printf(3)
  • man-Pages werden der meist mit der Section zitiert: printf(3)

man-Pages

  • Aufruf unter Linux:

    man [section] Begriff

    z.B.

    man 3 printf
  • Suche nach Sections:

    man -f Begriff
  • Suche nach Stichwort:

    man -k Stichwort

Dateisystem - Navigation

cdchange directory: Verzeichnis wechseln:

  • . aktuelles Verzeichnis
  • .. übergeordnetes Verzeichnis
  • - Verzeichnis, in dem man vor der letzten Navigation war
  • Ohne Argumente: navigiert cd in das Heimverzeichnis des Nutzers

cd ist im Terminal integriert und daher kein “Programm” im eigentlichen Sinne

Dateisystem - Navigation - Quiz

Wie navigiere ich vom aktuellen Verzeichnis in ein Verzeichnis eine Ebene über mir mit dem Namen “Projekte”?

  • $> cd ../Projekte
    • Das ist das einfachste
  • $> cd ./Projekte
    • Nein, das wäre im selben Verzeichnis
  • $> cd ./../Projekte
    • Unnötig, funktioniert aber auch
  • $> cd .././Projekte
    • Noch unnötiger, funktioniert aber auch-iger

Dateisystem - Inhalte auflisten

lslist: Verzeichnis auflisten:

  • -l langes Ausgabeformat
  • -a listet auch mit . beginnende Dateien und Verzeichnisse
  • Eigentliches Argument ist das Verzeichnis, was aufgelistet werden soll.
  • Ohne Argument Liste das aktuelle Arbeitsverzeichnis auf.

ls ist tatsächlich ein Programm: which ls vs. which cd

Dateisystem - Inhalte auflisten - Quiz

Wie kann ich mir detailiert alles im aktuellen Verzeichnis auflisten lassen?

  • $> ls
    • Das listet nur die Inhalte des Verzeichnisses ohne Details auf.
  • $> ls -l -a .
    • Das wäre die längste Notation.
  • $> ll
    • Das ist ein häufig voreingestellter Alias für das, was man machen will. Dieser muss jedoch nicht existieren.
  • $> ls -la
    • Mehrere Optionen kann man auch direkt zusammenfassen und das Standardziel für ls ist das aktuelle Verzeichnis.

Dateisystem - Arbeitsverzeichnis

pwdprint working directory: Aktuelles Verzeichnis ausgeben:

  • Es gibt keinen wirklichen Grund diesem Programm Argumente zu übergeben.
  • Wo bin ich? - pwd

Zusätzliche Informationen

  • Üblicherweise wird ~ zum Heimverzeichnis expandiert: cd ~/Downloads navigiert also z.B. zu /home/nutzer/Downloads.
  • Der Pfad / ist die Wurzel eures Dateisystems.

Dateisystem – Manipulation

  • chmodchange mode Rechte einer Datei ändern
  • cpcopy Datei(en) kopieren
  • mvmove Dateien(en) bewegen oder umbenennen
  • lnlink Dateiverknüpfung erstellen
  • ln -s Symbolische Dateiverknüpfung erstellen
  • rmremove Datei(en) löschen
  • mkdirmake directory Verzeichnis erzeugen
  • rmdirremove directory Verzeichnis löschen

Benutzer

  • id, groups eigene Benutzer-ID, Gruppenzugehörigkeit
  • who am Rechner angemeldete Benutzer

Zum Nachschlagen

  • getuid(2) gibt die Nutzer-ID zurück (C-Programmschnittstelle)
  • getgid(2) gibt die Hauptgruppen-ID zurück (C-Schnittstelle)

… und weitere! Alle Funktionen der C-Standardbibliothek besitzen einen Handbucheintrag.

Prozesse

  • psprocess snapshot Prozessliste ausgeben
    • -u [name] Suche auf Nutzer beschränken
    • -e everything - zeigt hingegen alles an
    • -f formatted - ausführliche Anzeige
  • toptable of processes Prozesstabelle anzeigen
    • -o [heading] Tabellensortierung vorgeben
    • Besseres Programm: htop
  • kill [pid] Prozess zum terminieren auffordern 🙏
    • -9 Signal 9 senden: Prozess 💀 töten 💀

Diverse Werkzeuge

  • cat — concatenate Dateien hintereinander ausgeben
  • less — opposite of more Dateien bildschirmweise ausgeben
  • head, tail Anfang/Ende einer Datei ausgeben (10 Zeilen)
  • calcalendar Kalender im Terminal anzeigen
  • wcword count Zeilen, Wörter und Zeichen zählen
  • grep, fgrep, egrep Nach bestimmten Mustern o. Wörtern suchen
  • find nach Dateien suchen

general regular expression and print

Diverse Werkzeuge

  • sed — stream editor z.B. zum Suchen und Ersetzen
  • tr — translate Zeichen aufeinander abbilden oder löschen
  • date Aktuelles Datum auf diverse Weisen ausgeben
  • cut Einzele Felder aus Zeilen ausschneiden
  • sort Sortieren

Pipelines

  • Standardausgabe und Standardeingaben lassen sich steuern
    • kommando > datei Redirection – Ausgabe wird in eine Datei umgeleitet
    • kommandoA | kommandoB Pipeline – Ausgabe wird zur Eingabe des Folgekommandos
  • Solche Pipleines erleichter die Arbeit mit Daten
    z.B.: grep Markus Studis.csv | cut -d , -f 2
  • Mehr dazu unter Pipelines und Redirections in sh(1)

Texteditoren

Geschmackssache — aber einen solltet ihr beherrschen:

  • Klassiker mit Nerdfaktor: vim/neovim, emacs
  • Minimalist: nano
  • Weitere mit GUI:
    • Kate, Geany, Gedit, VSCode/VSCodium, Eclipse, QTCreator,
  • Zum Programmieren nicht geeigent:
    • Office-Programme (MS Word, LibreOffice Writer, …)

GNU Compiler Collection

  • Ursprünglich: GNU C Compiler
  • Mittlerweile: Sammlung von verschiedenen Compilern
    (u.a. C, C++, Objective-C, Fortran 95, Rust, …)
  • Viele verschiedene Zielplattformen (x86, AMD64, ARM, …)

GNU Compiler Collection

  • C-Compiler: gcc
  • Compilieren und Linken eines C-Programms:
    • -Wall alle Warnungen ausgeben
    • -o <Ziel> Name für ausführbare Datei
  • Weitere nützliche Parameter (siehe man-Page):
    • -std=c17 -Werror -ansi -Wpedantic -D_POSIX_SOURCE
  • Warnungen sind grundsätzlich ernstzunehmen und zu beseitigen, daher möglichst immer mit -Werror übersetzen.

Nicht behandelte Warnungen behandeln wir als Fehler!

Übung macht den Meister!

  • Mit UNIX-Umgebung experimentieren
    • in der Rechnerübung,
    • in der Linux-VM von der BS-Website,
    • auf den Linux-Servern der IRB,
    • im Windows Subsystem for Linux (WSL) oder
    • in einer eigenen Linux-Installation
  • Anleitung für die Entwicklungsumgebung auf der Veranstaltungswebseite

Grundlagen der C-Programmierung

Wie sind eure Erfahrungen mit C(++)?

  • Studium: Nur DAP1
  • Privat: Mehr rumprobiert
  • Privat: Häufiger genutzt
  • Privat: Primäre Programmiersprache

Zeitplan

Braucht ihr in dieser Gruppe eine C-Einführung?

  • Ja
  • Nein

Aufgabe 0: Erste Schritte in C

  • Programm:
#include <stdio.h>
int is_even(int x) {
   if (x % 2 == 0) return 1;
   else return 0;
}
int main(void) {
	printf("%d\n", is_evne(4));
	return 0;
}
  • Compilieren/Linken:
images/typo_build.png

Aufgabe 0: Erste Schritte in C

  • Programm:
#include <stdio.h>
int is_even(int x) {
   if (x % 2 == 0) return 1;
   else return 0;
}
int main(void) {
	printf("%d\n", is_even(4));
	return 0;
}
  • Compilieren/Linken:
$ gcc -Wall -o test test.c
  • Ausführen:
$ ./test
1

Compiler Demo

Live Demo

Quiz-Zeit!

Quiz-Zeit!

Welche Aussage über Terminal und Shell stimmen?

  • Terminal und Shell sind gleichbedeutend.
    • Nein, beides sind getrennte Komponenten die beliebig kombiniert werden können.
  • Eine Shell ist traditionell ein Teil der Hardware, Terminal eine Software ist.
    • Nein, genau anders herrum!
  • Ein Terminal ist ein textbasiertes Interface, die Shell interpretiert Eingaben.
    • Richtig!

Quiz-Zeit!

Welcher der Folgenden Befehle gibt eine lange Textdatei vollständig aus?

  • head datei
    • Nein, head gibt nur den Anfang aus.
  • top datei
    • Nein, top gibt eine Prozesstabelle aus und nimmt keine Datei als Argument.
  • cat datei
    • Genau
  • tail datei
    • Nein, tail gibt nur das Ende aus.

Quiz-Zeit!

Wie werden Kommandos auf dem System gefunden?

  • Es wird immer nur im aktuellen Verzeichnis gesucht.
    • Nein
  • Es werden alle Ordner durchsucht, die bin heißen.
    • Nein
  • Es werden alle Ordner in der Umgebungsvariablen PATH durchsucht.
    • Genau
  • Es werden alle Ordner in der Umgebungsvariablen BIN durchsucht.
    • Nein

Quiz-Zeit!

Mit welchem Sonderzeichen kann man ein laufendes Programm direkt abbrechen?

  • <Ctrl>+<Backspace>
    • Nein, das wird höchstens das letzte Wort in der Kommandozeile löschen.
  • <Ctrl>+S
    • Nein, das pausiert nur die Ausgabe.
  • <Ctrl>+C
    • Genau
  • <Ctrl>+V
    • Nein, das wird höchstens eure Zwischenablage einfügen.

Gruppensuche

Falls ihr noch keine Dreiergruppe habt ist jetzt ein guter Moment, um eine zu suchen.

Warum?
images/komm-in-die-gruppe.gif