Betriebssysteme
Besprechung: 0. Erste Schritte
https://ess.cs.tu-dortmund.de/DE/Teaching/SS2020/BS/
Horst Schirmeier
horst.schirmeier@tu-dortmund.de
https://ess.cs.tu-dortmund.de/~hsc
AG Eingebettete Systemsoftware mit Material von Olaf Spinczyk, Informatik 12, TU Dortmund Universität Osnabrück
Theoriefrage 1
Mit welchem Parameter listet ls auch Dateien in Unterverzeichnissen?
2
Theoriefrage 1
Mit welchem Parameter listet ls auch Dateien in Unterverzeichnissen?
studi@bsvm:~$ ls -R
.:
Bilder Dokumente Downloads Musik Öffentlich
Schreibtisch Videos Vorlagen
./Bilder:
./Dokumente:
./Downloads:
./Musik:
./Öffentlich:
./Schreibtisch:
firefox-esr.desktop org.kde.kate.desktop xfce4-terminal.desktop geany.desktop pluma.desktop
./Videos:
./Vorlagen:
3
Theoriefrage 2
Erklärt in eigenen Worten, wofür man das UNIX-Kommando man verwendet. Erklärt den Unterschied zwischen den Befehlen man 1 printf und man 3 printf und was hier beschrieben wird.
4
Theoriefrage 2
Erklärt in eigenen Worten, wofür man das UNIX-Kommando man verwendet. Erklärt den Unterschied zwischen den Befehlen man 1 printf und man 3 printf und was hier beschrieben wird.
man gibt die Handbuchseite/Anleitung (Manual) zu dem Befehl oder der Funktion oder Datei an.
Die Nummer hinter man bestimmt, in welchem Themenbereich/welcher Section gesucht werden soll.
man 1 printf beschreibt das Shell-Kommando printf. man 3 printf beschreibt die C-Funktion printf aus stdio.h.
5
Theoriefrage 3
Mit welchem UNIX-Kommando kann man Dateien löschen? Mit welchem Parameter löscht man einen kompletten Verzeichnisbaum?
6
Theoriefrage 3
Mit welchem UNIX-Kommando kann man Dateien löschen? Mit welchem Parameter löscht man einen kompletten Verzeichnisbaum?
rm DATEI
rm -r VERZEICHNIS
studi@bsvm:~$ touch datei
studi@bsvm:~$ rm datei
studi@bsvm:~$ mkdir verzeichnis studi@bsvm:~$ mkdir verzeichnis/verzeichnis2 studi@bsvm:~$ touch verzeichnis/datei studi@bsvm:~$ rm -r verzeichnis/
7
Programmierung in C – 1
#include
int globalUninit;
int globalInit = 3;
int sum_n(int n) {
if (n <= 0) {
return 0;
} else if (n == 1) {
return 1;
} else {
} }
return n + sum_n(n - 1);
8
Programmierung in C - 2
int main(void) {
int lokal = 3;
}
printf("Adresse von globalUninit ist %p\n",
(void*)&globalUninit);
printf("Adresse von globalInit ist %p\n",
(void*)&globalInit);
printf("Adresse von lokal ist %p\n",
(void*)&lokal);
printf("Summe von 1 bis 5: %d\n", sum_n(5));
return 0;
9
Programmieren in C
1. Probiert verschiedene (auch große!) Werte für den Parameter n aus. Warum läuft das Programm ab einem bestimmten Wert von n nicht mehr bis zum Ende? Wie groß ist n in eurem Fall?
10
Programmieren in C
1. Probiert verschiedene (auch große!) Werte für den Parameter n aus. Warum läuft das Programm ab einem bestimmten Wert von n nicht mehr bis zum Ende? Wie groß ist n in eurem Fall?
Bei n >= 65530
Kein korrektes Ergebnis, da ein Integer-Überlauf stattfindet Programm läuft aber trotzdem bis zum Ende → falsche Antwort
●
– –
●
– –
–
Bei n >= 260000 stürzt das Programm ab
Prozesse haben nur einen begrenzten Stack Speicherzugriffe über die untere Grenze des Stacks hinaus
verursachen segmentation fault → Prozess wird beendet
Zahl variiert, da der Kernel bei jeder Ausführung den Stackpointer zufällig initialisiert
11
Programmieren in C
2. Welchen Abstand (in Bytes) haben die Adressen zweier nacheinander in main() angelegter Variablen vom Typ double? Erklärt außerdem, wie dieser Abstand zustande kommt.
12
Programmieren in C
2. Welchen Abstand (in Bytes) haben die Adressen zweier nacheinander in main() angelegter Variablen vom Typ double? Erklärt außerdem, wie dieser Abstand zustande kommt.
Der Abstand entspricht 8 Bytes. Er ergibt sich aus der Größe des Datentyps.
Hier: sizeof(double) = 8
13
Programmieren in C
3. Warum liegt eine globale int-Variable an einer völlig anderen Adresse?
14
Programmieren in C
3. Warum liegt eine globale int-Variable an einer völlig anderen Adresse?
Globale Variablen werden nicht auf dem Stack, sondern im BSS- (uninitialisiert) oder Datensegment (initialisiert) abgelegt.
15
Programmieren in C
4. Warum wird die Adresse einer lokalen Variablen in der rekursiven Funktion immer kleiner, wenn die Funktion immer weiter „rekursiv absteigt“?
16
Programmieren in C
4. Warum wird die Adresse einer lokalen Variablen in der rekursiven Funktion immer kleiner, wenn die Funktion immer weiter „rekursiv absteigt“?
Bei jedem Aufruf einer Funktion wird ein neuer Stackframe auf dem Stack abgelegt
Der Stack wächst dabei „nach unten”
Der Stackframe enthält die Parameter, die Rücksprungadresse, den Framepointer und auch die lokalen Variablen
→ Die Adresse lokaler Variablen werden beim rekursiven Abstieg immer kleiner
…
n=3
Rücksprungadresse
Framepointer
local
n=2
Rücksprungadresse
Framepointer
local
n=1
Rücksprungadresse
Framepointer
local
●
● ●
17
Programmierung in C – Extended
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("Fehler: Keine Obergrenze angegeben\n");
return -1;
} else if (argc > 2) {
printf(“Fehler: Zu viele Parameter angegeben\n”);
return -2;
}
int input = atoi(argv[1]);
if (input < 1) {
printf("Fehler: Negative Zahl oder 0 "
"als Obergrenze angegeben\n");
return -1; }
sum_n(input); /* dort der Code wie in der Basisaufgabe */
}
18