|
|
|
|
|
|
1
|
# Homework hw4 task1
|
1
|
# Homework hw4 task1
|
|
2
|
|
2
|
|
|
3
|
-Ziel dieser Aufgabe ist es, mittels des externen Crates `procinfo` einige Prozessverwaltungs-Informationen kennen zu lernen, die das Betriebssystem beim Ausführen der Prozesse verwaltet. Fertige Programme wie **ps**, **htop** oder **pmap** verwenden diese Informationen, um über das System und Tasks Auskunft zu geben.
|
|
|
|
4
|
-
|
|
|
|
5
|
-Die Funktionalität der Programms wird auf die 3 Module aufgeteilt:
|
|
|
|
6
|
-
|
|
|
|
7
|
-- `main.rs`: die Funktion `main()
|
|
|
|
8
|
-- `readproc.rs`: Handling der Funktionen, die angefragte Informationen aus dem `proc/` Verzeichnis zu Verfügung stellen.
|
|
|
|
9
|
-- `pstree.rs`: Struct und Methoden, um einen 'pstree' darzustellen
|
|
|
|
10
|
-
|
|
|
|
11
|
-## Gliederung
|
|
|
|
12
|
-
|
|
|
|
13
|
-<!-- MarkdownTOC -->
|
|
|
|
14
|
-
|
|
|
|
|
|
3
|
+- [Überblick](#%C3%BCberblick)
|
|
15
|
- [Daten aus dem /proc Verzeichnis lesen](#daten-aus-dem-proc-verzeichnis-lesen)
|
4
|
- [Daten aus dem /proc Verzeichnis lesen](#daten-aus-dem-proc-verzeichnis-lesen)
|
|
16
|
- [Externe Crate nutzen](#externe-crate-nutzen)
|
5
|
- [Externe Crate nutzen](#externe-crate-nutzen)
|
|
17
|
- [Optionalen Parameter parsen](#optionalen-parameter-parsen)
|
6
|
- [Optionalen Parameter parsen](#optionalen-parameter-parsen)
|
|
18
|
- [Aufgaben](#aufgaben)
|
7
|
- [Aufgaben](#aufgaben)
|
|
19
|
- - [Externe Crate in Dependencies eintragen](#externe-crate-in-dependencies-eintragen)
|
|
|
|
20
|
- - [`readproc.rs`: Eigene Prozessinformationen auslesen](#readprocrs-eigene-prozessinformationen-auslesen)
|
|
|
|
21
|
- - [`pstree.rs`: Prozesskette ausgeben](#pstreers-prozesskette-ausgeben)
|
|
|
|
|
|
8
|
+ - [Externe Crate in Dependencies eintragen](#externe-crate-in-dependencies-eintragen)
|
|
|
|
9
|
+ - [`readproc.rs`: Eigene Prozessinformationen auslesen](#readprocrs-eigene-prozessinformationen-auslesen)
|
|
|
|
10
|
+ - [`pstree.rs`: Prozesskette ausgeben](#pstreers-prozesskette-ausgeben)
|
|
22
|
- [Kontrolle Ihres Repositories](#kontrolle-ihres-repositories)
|
11
|
- [Kontrolle Ihres Repositories](#kontrolle-ihres-repositories)
|
|
23
|
|
12
|
|
|
24
|
-<!-- /MarkdownTOC -->
|
|
|
|
25
|
-
|
|
|
|
26
|
-
|
|
|
|
27
|
-## Daten aus dem /proc Verzeichnis lesen
|
|
|
|
|
|
13
|
+## Überblick
|
|
28
|
|
14
|
|
|
29
|
-"Das `/proc`-Verzeichnis ist kein wirkliches Dateisystem, sondern
|
|
|
|
30
|
-eine Schnittstelle zum Kernel. Die Dateien, die in diesem Verzeichnis liegen, benutzen keinen Speicherplatz auf der Platte, sind aber trotzdem les- und in manchen Fällen auch beschreibbar.
|
|
|
|
|
|
15
|
+Ziel dieser Aufgabe ist es, mittels des externen Crates `procinfo` einige
|
|
|
|
16
|
+Prozessverwaltungs-Informationen kennen zu lernen, die das Betriebssystem beim
|
|
|
|
17
|
+Ausführen der Prozesse verwaltet. Fertige Programme wie **ps**, **htop** oder
|
|
|
|
18
|
+**pmap** verwenden diese Informationen, um über das System und Tasks Auskunft zu
|
|
|
|
19
|
+geben.
|
|
31
|
|
20
|
|
|
32
|
-Seinen Namen trägt dieses Verzeichnis daher, dass es für jeden laufenden Prozess ein Unterverzeichnis bereithält, das Informationen über diesen Prozess zur Verfügung stellt. Das Unterverzeichnis trägt als Namen die ProzessID (PID) des jeweiligen Prozesses. Es enthält unter anderem folgende Dateien:
|
|
|
|
33
|
-
|
|
|
|
34
|
- * `cmdline` Die Kommandozeile, mit der der Prozess gestartet wurde, mit allen verwendeten Parametern.
|
|
|
|
35
|
- * `cwd` (current working directory) Ein symbolischer Link auf das Verzeichnis, das beim Aufruf des Prozesses das aktuelle Arbeitsverzeichnis war.
|
|
|
|
36
|
- * `environ` Die komplette Umgebung des Prozesses (Variablen, Funktionen usw.) sofern er eine Umgebung hat.
|
|
|
|
37
|
- * `exe` Ein symbolischer Link auf das aufgerufene Programm, dass den Prozess ausmacht.
|
|
|
|
38
|
- * `root` Ein symbolischer Link auf das Verzeichnis, das für den Prozess das Wurzelverzeichnis darstellt.
|
|
|
|
39
|
-
|
|
|
|
40
|
-Daneben finden sich weitere Informationen zu den verwendeten Ressourcen (Speicher, Libraries) und ein Unterverzeichnis **fd**, das die File-Descriptoren aller vom Prozess verwendeten Dateien enthält.
|
|
|
|
41
|
-
|
|
|
|
42
|
-Diese Information wird beispielsweise von den Programmen verwertet, die Prozess-Informationen ausgeben." (aus [Referenz][])
|
|
|
|
|
|
21
|
+Die Funktionalität der Programms wird auf die 3 Module aufgeteilt:
|
|
43
|
|
22
|
|
|
44
|
-Das `/proc` Verzeichnis steht nur unter Linux zu Verfügung. Daher müssen Programme, die auf `/proc` zugreifen auch auf einem Linux System erstellt und getestet werden.
|
|
|
|
|
|
23
|
+- `main.rs`: die Funktion `main()
|
|
|
|
24
|
+- `readproc.rs`: Handling der Funktionen, die angefragte Informationen aus dem
|
|
|
|
25
|
+ `proc/` Verzeichnis zu Verfügung stellen.
|
|
|
|
26
|
+- `pstree.rs`: Struct und Methoden, um einen 'pstree' darzustellen
|
|
45
|
|
27
|
|
|
|
|
28
|
+## Daten aus dem /proc Verzeichnis lesen
|
|
46
|
|
29
|
|
|
|
|
30
|
+"Das `/proc`-Verzeichnis ist kein wirkliches Dateisystem, sondern eine
|
|
|
|
31
|
+Schnittstelle zum Kernel. Die Dateien, die in diesem Verzeichnis liegen,
|
|
|
|
32
|
+benutzen keinen Speicherplatz auf der Platte, sind aber trotzdem les- und in
|
|
|
|
33
|
+manchen Fällen auch beschreibbar.
|
|
|
|
34
|
+
|
|
|
|
35
|
+Seinen Namen trägt dieses Verzeichnis daher, dass es für jeden laufenden Prozess
|
|
|
|
36
|
+ein Unterverzeichnis bereithält, das Informationen über diesen Prozess zur
|
|
|
|
37
|
+Verfügung stellt. Das Unterverzeichnis trägt als Namen die ProzessID (PID) des
|
|
|
|
38
|
+jeweiligen Prozesses. Es enthält unter anderem folgende Dateien:
|
|
|
|
39
|
+
|
|
|
|
40
|
+- `cmdline` Die Kommandozeile, mit der der Prozess gestartet wurde, mit allen
|
|
|
|
41
|
+ verwendeten Parametern.
|
|
|
|
42
|
+- `cwd` (current working directory) Ein symbolischer Link auf das Verzeichnis,
|
|
|
|
43
|
+ das beim Aufruf des Prozesses das aktuelle Arbeitsverzeichnis war.
|
|
|
|
44
|
+- `environ` Die komplette Umgebung des Prozesses (Variablen, Funktionen usw.)
|
|
|
|
45
|
+ sofern er eine Umgebung hat.
|
|
|
|
46
|
+- `exe` Ein symbolischer Link auf das aufgerufene Programm, dass den Prozess
|
|
|
|
47
|
+ ausmacht.
|
|
|
|
48
|
+- `root` Ein symbolischer Link auf das Verzeichnis, das für den Prozess das
|
|
|
|
49
|
+ Wurzelverzeichnis darstellt.
|
|
|
|
50
|
+
|
|
|
|
51
|
+Daneben finden sich weitere Informationen zu den verwendeten Ressourcen
|
|
|
|
52
|
+(Speicher, Libraries) und ein Unterverzeichnis **fd**, das die File-Descriptoren
|
|
|
|
53
|
+aller vom Prozess verwendeten Dateien enthält.
|
|
|
|
54
|
+
|
|
|
|
55
|
+Diese Information wird beispielsweise von den Programmen verwertet, die
|
|
|
|
56
|
+Prozess-Informationen ausgeben." (aus [Referenz][])
|
|
|
|
57
|
+
|
|
|
|
58
|
+Das `/proc` Verzeichnis steht nur unter Linux zu Verfügung. Daher müssen
|
|
|
|
59
|
+Programme, die auf `/proc` zugreifen auch auf einem Linux System erstellt und
|
|
|
|
60
|
+getestet werden.
|
|
47
|
|
61
|
|
|
48
|
## Externe Crate nutzen
|
62
|
## Externe Crate nutzen
|
|
49
|
-Um nicht selbst im Programm auf die nötigen Dateien per File E/A im ´/proc´ zugreifen zu müssen, wird zum Auslesen eine externe Crate benutzt. Die Crate *[procinfo][]* stellt dazu die nötigen Funktionen zu Verfügung. Die Funktionen liefern in einem Result eine Datenstruktur, aus der wir die benötigten Informationen komfortabel auslesen können. Verwenden Sie in Ihrem Programm soweit wie möglich die Funktionen des externen Crates *procinfo*, auch wenn in der Standard-Bibliothek ebenfalls Funktionen für einzelne Aufgaben zu Verfügung stehen.
|
|
|
|
50
|
|
63
|
|
|
|
|
64
|
+Um nicht selbst im Programm auf die nötigen Dateien per File E/A im ´/proc´
|
|
|
|
65
|
+zugreifen zu müssen, wird zum Auslesen eine externe Crate benutzt. Die Crate
|
|
|
|
66
|
+*[procinfo][]* stellt dazu die nötigen Funktionen zu Verfügung. Die Funktionen
|
|
|
|
67
|
+liefern in einem Result eine Datenstruktur, aus der wir die benötigten
|
|
|
|
68
|
+Informationen komfortabel auslesen können. Verwenden Sie in Ihrem Programm
|
|
|
|
69
|
+soweit wie möglich die Funktionen des externen Crates *procinfo*, auch wenn in
|
|
|
|
70
|
+der Standard-Bibliothek ebenfalls Funktionen für einzelne Aufgaben zu Verfügung
|
|
|
|
71
|
+stehen.
|
|
51
|
|
72
|
|
|
52
|
## Optionalen Parameter parsen
|
73
|
## Optionalen Parameter parsen
|
|
53
|
|
74
|
|
|
54
|
-Der Optionale Parameter PID (u32) entscheidet darüber, ob Ihr Programm die Funktionen des Moduls `readproc.rs` oder `pstree.rs` verwendet. Wird kein Parameter angegeben, so werden die Funktionen des Moduls `readproc.rs` benutzt.
|
|
|
|
55
|
-
|
|
|
|
|
|
75
|
+Der Optionale Parameter PID (u32) entscheidet darüber, ob Ihr Programm die
|
|
|
|
76
|
+Funktionen des Moduls `readproc.rs` oder `pstree.rs` verwendet. Wird kein
|
|
|
|
77
|
+Parameter angegeben, so werden die Funktionen des Moduls `readproc.rs` benutzt.
|
|
56
|
|
78
|
|
|
57
|
## Aufgaben
|
79
|
## Aufgaben
|
|
58
|
|
80
|
|
|
59
|
### Externe Crate in Dependencies eintragen
|
81
|
### Externe Crate in Dependencies eintragen
|
|
60
|
|
82
|
|
|
61
|
- Benutzen Sie für die folgenden Aufgaben das *[procinfo][]* Crate.
|
83
|
- Benutzen Sie für die folgenden Aufgaben das *[procinfo][]* Crate.
|
|
62
|
-- Fügen Sie dazu den notwendigen Eintrag unter `[dependencies]` in **Cargo.toml** hinzu.
|
|
|
|
63
|
-- Um auf die nötige Funktionen des Crate zugreifen zu können schreiben Sie NUR in **main.rs** bitte folgenden Zeilen an den Beginn der Datei:
|
|
|
|
|
|
84
|
+- Fügen Sie dazu den notwendigen Eintrag unter `[dependencies]` in
|
|
|
|
85
|
+ **Cargo.toml** hinzu.
|
|
|
|
86
|
+- Um auf die nötige Funktionen des Crate zugreifen zu können schreiben Sie NUR
|
|
|
|
87
|
+ in **main.rs** bitte folgenden Zeilen an den Beginn der Datei:
|
|
64
|
|
88
|
|
|
65
|
```Rust
|
89
|
```Rust
|
|
66
|
extern crate procinfo;
|
90
|
extern crate procinfo;
|
|
67
|
```
|
91
|
```
|
|
68
|
|
92
|
|
|
69
|
-Benutzen Sie in Ihren Modulen `readproc.rs` und `pstree.rs` die `use` Anweisung geeignet, um auf die nötigen Funktionen des Crate *procinfo* in den Modulen zugreifen zu können.
|
|
|
|
|
|
93
|
+Benutzen Sie in Ihren Modulen `readproc.rs` und `pstree.rs` die `use` Anweisung
|
|
|
|
94
|
+geeignet, um auf die nötigen Funktionen des Crate *procinfo* in den Modulen
|
|
|
|
95
|
+zugreifen zu können.
|
|
70
|
|
96
|
|
|
71
|
-In der Crate *procinfo* wird als Return ein Result Typ mit nur dem OK Typ benutzt. Der Err Typ ist scheinbar nicht im Result enthalten. Wenn man allerdings die Info der Standardbibliothek zu [io::Result][] liest, erfährt man, dass es sich hier um einen Alias handelt, der komfortableres Arbeiten mit Errors erlaubt. Dazu kommen wir aber erst in späteren Kapiteln, wenn wir uns dem `?` Makro nähern. Daher bitte hier in der Aufgabe noch keine Makros wie `try` und `?` benutzen.
|
|
|
|
|
|
97
|
+In der Crate *procinfo* wird als Return ein Result Typ mit nur dem OK Typ
|
|
|
|
98
|
+benutzt. Der Err Typ ist scheinbar nicht im Result enthalten. Wenn man
|
|
|
|
99
|
+allerdings die Info der Standardbibliothek zu [io::Result][] liest, erfährt man,
|
|
|
|
100
|
+dass es sich hier um einen Alias handelt, der komfortableres Arbeiten mit Errors
|
|
|
|
101
|
+erlaubt. Dazu kommen wir aber erst in späteren Kapiteln, wenn wir uns dem `?`
|
|
|
|
102
|
+Makro nähern. Daher bitte hier in der Aufgabe noch keine Makros wie `try` und
|
|
|
|
103
|
+`?` benutzen.
|
|
72
|
|
104
|
|
|
73
|
### `readproc.rs`: Eigene Prozessinformationen auslesen
|
105
|
### `readproc.rs`: Eigene Prozessinformationen auslesen
|
|
74
|
|
106
|
|
|
75
|
-Ziel dieser Teilaufgabe ist es das Crate *procinfo* kennen zu lernen und sich noch ein wenig mit dem Return Typ 'Result' und der Fehlerbehandlung zu üben.
|
|
|
|
|
|
107
|
+Ziel dieser Teilaufgabe ist es das Crate *procinfo* kennen zu lernen und sich
|
|
|
|
108
|
+noch ein wenig mit dem Return Typ 'Result' und der Fehlerbehandlung zu üben.
|
|
76
|
|
109
|
|
|
77
|
-Die folgenden Funktionen werden im Modul `readproc.rs` implementiert. Alle Funktionen reichen mögliche Fehler über einen Result zurück zur aufrufenden Funktion. Keine der Funktionen darf im Fehlerfall einen Programmabbruch erzwingen.
|
|
|
|
|
|
110
|
+Die folgenden Funktionen werden im Modul `readproc.rs` implementiert. Alle
|
|
|
|
111
|
+Funktionen reichen mögliche Fehler über einen Result zurück zur aufrufenden
|
|
|
|
112
|
+Funktion. Keine der Funktionen darf im Fehlerfall einen Programmabbruch
|
|
|
|
113
|
+erzwingen.
|
|
78
|
|
114
|
|
|
79
|
-1. Schreiben Sie die Funktion `fn self_pids() -> Result<(i32, i32), &'static str>`, die die eigene PID und die PPID in einem Tupel (PID,PPID) Im Erfolgsfall zurückgibt.
|
|
|
|
|
|
115
|
+1. Schreiben Sie die Funktion `fn self_pids() -> Result<(i32, i32), &'static
|
|
|
|
116
|
+ str>`, die die eigene PID und die PPID in einem Tupel (PID,PPID) Im
|
|
|
|
117
|
+ Erfolgsfall zurückgibt.
|
|
80
|
|
118
|
|
|
81
|
- > Hinweis: Überlegen Sie sich, ob `stat()` und der `stat_self()` die geeignetere Funktion im *procinfo* Crate für diesen Fall ist.
|
|
|
|
|
|
119
|
+ > Hinweis: Überlegen Sie sich, ob `stat()` und der `stat_self()` die
|
|
|
|
120
|
+ > geeignetere Funktion im *procinfo* Crate für diesen Fall ist.
|
|
82
|
|
121
|
|
|
83
|
-2. Schreiben Sie die Funktion `fn get_pid_command(pid: i32) -> Result<String, &'static str>`, die den Command Namen zu einer PID zurück liefert. Wird die PID nicht gefunden im System, so soll die Funktion den String "PID not alive: no command name found" zurück geben.
|
|
|
|
|
|
122
|
+1. Schreiben Sie die Funktion `fn get_pid_command(pid: i32) -> Result<String,
|
|
|
|
123
|
+ &'static str>`, die den Command Namen zu einer PID zurück liefert. Wird die
|
|
|
|
124
|
+ PID nicht gefunden im System, so soll die Funktion den String "PID not alive:
|
|
|
|
125
|
+ no command name found" zurück geben.
|
|
84
|
|
126
|
|
|
85
|
-3. Schreiben Sie die Funktion `fn get_last_created_command() -> Result<String, &'static str>`, die den Command Namen des zuletzt erzeugten Prozesses im System zurück gibt. Wird die PID nicht gefunden im System, so soll die Funktion den String "No last command via PID found" zurück geben.
|
|
|
|
|
|
127
|
+1. Schreiben Sie die Funktion `fn get_last_created_command() -> Result<String,
|
|
|
|
128
|
+ &'static str>`, die den Command Namen des zuletzt erzeugten Prozesses im
|
|
|
|
129
|
+ System zurück gibt. Wird die PID nicht gefunden im System, so soll die
|
|
|
|
130
|
+ Funktion den String "No last command via PID found" zurück geben.
|
|
86
|
|
131
|
|
|
87
|
> Tip: `loadavg()` Funktion.
|
132
|
> Tip: `loadavg()` Funktion.
|
|
88
|
|
133
|
|
|
89
|
-4. Schreiben Sie die Funktion `fn get_thread_count(pid: i32) -> Result<u32, &'static str>`, die die Anzahl der Threads pro PID zurückliefert. Wird die PID nicht gefunden im System, so soll die Funktion den String "PID not alive: no threads counted" zurück geben.
|
|
|
|
|
|
134
|
+1. Schreiben Sie die Funktion `fn get_thread_count(pid: i32) -> Result<u32,
|
|
|
|
135
|
+ &'static str>`, die die Anzahl der Threads pro PID zurückliefert. Wird die
|
|
|
|
136
|
+ PID nicht gefunden im System, so soll die Funktion den String "PID not alive:
|
|
|
|
137
|
+ no threads counted" zurück geben.
|
|
90
|
|
138
|
|
|
91
|
-5. Benutzen Sie nun Ihre Funktionen geeignet, um in Ihrer `main() Funktion folgende Ausgaben zu produzieren:
|
|
|
|
|
|
139
|
+1. Benutzen Sie nun Ihre Funktionen geeignet, um in Ihrer `main()` Funktion
|
|
|
|
140
|
+ folgende Ausgaben zu produzieren:
|
|
92
|
|
141
|
|
|
93
|
```text
|
142
|
```text
|
|
94
|
My PID : 31894 - process1 running 4 threads
|
143
|
My PID : 31894 - process1 running 4 threads
|
|
|
|
|
|
|
96
|
Last process created in system was: process3
|
145
|
Last process created in system was: process3
|
|
97
|
```
|
146
|
```
|
|
98
|
|
147
|
|
|
99
|
- > Hinweis: Die Nummer und Command Namen sind bei Ihnen verschieden. Wenn Sie Probleme beim Aufruf Ihres Programms über **cargo run** haben lesen Sie unbedingt die nächste Frage!
|
|
|
|
|
|
148
|
+ > Hinweis: Die Nummer und Command Namen sind bei Ihnen verschieden. Wenn Sie
|
|
|
|
149
|
+ > Probleme beim Aufruf Ihres Programms über **cargo run** haben lesen Sie
|
|
|
|
150
|
+ > unbedingt die nächste Frage!
|
|
100
|
|
151
|
|
|
101
|
-6. Sie können Ihr Programm über:
|
|
|
|
|
|
152
|
+1. Sie können Ihr Programm über:
|
|
102
|
|
153
|
|
|
103
|
- **cargo run** oder
|
154
|
- **cargo run** oder
|
|
104
|
- **./target/debug/task1** starten.
|
155
|
- **./target/debug/task1** starten.
|
|
105
|
|
156
|
|
|
106
|
- Überlegen Sie sich, wie es zu den unterschiedlichen Ausgaben und Programmverhalten kommt.
|
|
|
|
|
|
157
|
+ Überlegen Sie sich, wie es zu den unterschiedlichen Ausgaben und
|
|
|
|
158
|
+ Programmverhalten kommt.
|
|
107
|
|
159
|
|
|
108
|
-7. Schreiben Sie die Funktion `fn get_task_total() -> Result<u32, &'static str>`, die die Gesamtmenge aller Tasks im System zurück liefert. Wird die Gesamtmenge nicht gefunden, so soll die Funktion den String "No total count of tasks in system found" zurück geben.
|
|
|
|
|
|
160
|
+1. Schreiben Sie die Funktion `fn get_task_total() -> Result<u32, &'static
|
|
|
|
161
|
+ str>`, die die Gesamtmenge aller Tasks im System zurück liefert. Wird die
|
|
|
|
162
|
+ Gesamtmenge nicht gefunden, so soll die Funktion den String "No total count
|
|
|
|
163
|
+ of tasks in system found" zurück geben.
|
|
109
|
|
164
|
|
|
110
|
- > Warum z.B. zeigt Ihnen das Programm **htop** eine andere Anzahl von Prozessen als Ihre ausgelesene Funktion?
|
|
|
|
|
|
165
|
+ > Warum z.B. zeigt Ihnen das Programm **htop** eine andere Anzahl von
|
|
|
|
166
|
+ > Prozessen als Ihre ausgelesene Funktion?
|
|
111
|
|
167
|
|
|
112
|
-8. Schreiben Sie die Funktion `fn get_ownprocess_mem() -> Result<(usize,usize,usize), &'static str>`, die in einem Tuple die Werte für:
|
|
|
|
|
|
168
|
+1. Schreiben Sie die Funktion `fn get_ownprocess_mem() ->
|
|
|
|
169
|
+ Result<(usize,usize,usize), &'static str>`, die in einem Tuple die Werte für:
|
|
113
|
|
170
|
|
|
114
|
- vsize
|
171
|
- vsize
|
|
115
|
- code und
|
172
|
- code und
|
|
|
|
|
|
|
117
|
|
174
|
|
|
118
|
zurück liefert.
|
175
|
zurück liefert.
|
|
119
|
|
176
|
|
|
120
|
-9. Im Modul `main.rs` produzieren Sie die Ausgabe für die Kommandozeile und kümmern sich um evtl. Fehler. Bei korrektem Programmablauf ergibt sich folgende Ausgabe (genau 5 Zeilen!):
|
|
|
|
|
|
177
|
+1. Im Modul `main.rs` produzieren Sie die Ausgabe für die Kommandozeile und
|
|
|
|
178
|
+ kümmern sich um evtl. Fehler. Bei korrektem Programmablauf ergibt sich
|
|
|
|
179
|
+ folgende Ausgabe (genau 5 Zeilen!):
|
|
121
|
|
180
|
|
|
122
|
```text
|
181
|
```text
|
|
123
|
My PID : 31894 - process1 running 4 threads
|
182
|
My PID : 31894 - process1 running 4 threads
|
|
|
|
|
|
|
129
|
|
188
|
|
|
130
|
### `pstree.rs`: Prozesskette ausgeben
|
189
|
### `pstree.rs`: Prozesskette ausgeben
|
|
131
|
|
190
|
|
|
132
|
-1. Auf Basis des Crate *procinfo* sollen Sie bei Aufruf des Programms mit einer PID, ausgehend von dieser PID der Tree bis zum aktuellen Programm ausgegeben werden. Wird somit als Argument eine `1` angegeben, wird eine Funktionalität des Kommandozeilen Programms **pstree** nachgebildet. Wenn Sie sich z.B. mit dem Kommando **ps** die PID Ihrer aktuellen Shell anzeigen lassen, können Sie sich durch Aufruf von **pstree -p -s PID** die Kette aller Elternprozesse dieser PID anzeigen lassen.
|
|
|
|
|
|
191
|
+1. Auf Basis des Crate *procinfo* sollen Sie bei Aufruf des Programms mit einer
|
|
|
|
192
|
+ PID, ausgehend von dieser PID der Tree bis zum aktuellen Programm ausgegeben
|
|
|
|
193
|
+ werden. Wird somit als Argument eine `1` angegeben, wird eine Funktionalität
|
|
|
|
194
|
+ des Kommandozeilen Programms **pstree** nachgebildet. Wenn Sie sich z.B. mit
|
|
|
|
195
|
+ dem Kommando **ps** die PID Ihrer aktuellen Shell anzeigen lassen, können Sie
|
|
|
|
196
|
+ sich durch Aufruf von **pstree -p -s PID** die Kette aller Elternprozesse
|
|
|
|
197
|
+ dieser PID anzeigen lassen.
|
|
133
|
|
198
|
|
|
134
|
```text
|
199
|
```text
|
|
135
|
systemd(1)---sshd(1264)---sshd(7161)---sshd(7198)---zsh(7199)---pstree(47200)
|
200
|
systemd(1)---sshd(1264)---sshd(7161)---sshd(7198)---zsh(7199)---pstree(47200)
|
|
136
|
```
|
201
|
```
|
|
137
|
|
202
|
|
|
138
|
- Genau diese Ausgabe soll nun ihr Programm erzeugen bei der Option '1'. Geben Sie im obigen Beispiel die PID 7161 als Parameter an, so wird nur der Teil-Tree ausgegeben, startend vom Prozess mit PID 7161.
|
|
|
|
|
|
203
|
+ Genau diese Ausgabe soll nun ihr Programm erzeugen bei der Option '1'. Geben
|
|
|
|
204
|
+ Sie im obigen Beispiel die PID 7161 als Parameter an, so wird nur der
|
|
|
|
205
|
+ Teil-Tree ausgegeben, startend vom Prozess mit PID 7161.
|
|
139
|
|
206
|
|
|
140
|
```text
|
207
|
```text
|
|
141
|
sshd(7161)---sshd(7198)---zsh(7199)---pstree(47200)
|
208
|
sshd(7161)---sshd(7198)---zsh(7199)---pstree(47200)
|
|
142
|
```
|
209
|
```
|
|
143
|
|
210
|
|
|
144
|
- Ausgehend von der eigenen pid sollen alle Elternpid bis zum übergebenen PID (z.B. 1 für init Prozess, hier `systemd`) angezeigt werden. Der Init Prozess (hier systemd) hat immer die PID 1 in UNIX Systemen.
|
|
|
|
|
|
211
|
+ Ausgehend von der eigenen pid sollen alle Elternpid bis zum übergebenen PID
|
|
|
|
212
|
+ (z.B. 1 für init Prozess, hier `systemd`) angezeigt werden. Der Init Prozess
|
|
|
|
213
|
+ (hier systemd) hat immer die PID 1 in UNIX Systemen.
|
|
145
|
|
214
|
|
|
146
|
-2. Nutzen Sie zum parsen der PID im Argument die `parse()` Funktion. Behandeln Sie folgende Fehler:
|
|
|
|
|
|
215
|
+1. Nutzen Sie zum parsen der PID im Argument die `parse()` Funktion. Behandeln
|
|
|
|
216
|
+ Sie folgende Fehler:
|
|
147
|
|
217
|
|
|
148
|
- Parameter ist keine Zahl
|
218
|
- Parameter ist keine Zahl
|
|
149
|
- Parameter ist keine Elternpid
|
219
|
- Parameter ist keine Elternpid
|
|
150
|
- Mehr als 2 Parameter werden bei Aufruf mit angegeben.
|
220
|
- Mehr als 2 Parameter werden bei Aufruf mit angegeben.
|
|
151
|
|
221
|
|
|
152
|
- Geben Sie im Fehlerfall eine entsprechende Meldung in einer(1!) Zeile aus und beenden Sie das Programm mit dem Exitcode 1. Eine möglich Ausgabe:
|
|
|
|
|
|
222
|
+ Geben Sie im Fehlerfall eine entsprechende Meldung in einer(1!) Zeile aus und
|
|
|
|
223
|
+ beenden Sie das Programm mit dem Exitcode 1. Eine möglich Ausgabe:
|
|
153
|
|
224
|
|
|
154
|
```text
|
225
|
```text
|
|
155
|
$ ./task1 2 3
|
226
|
$ ./task1 2 3
|
|
156
|
Correct usage: no param or param PID
|
227
|
Correct usage: no param or param PID
|
|
157
|
```
|
228
|
```
|
|
158
|
|
229
|
|
|
159
|
- >Wichtig: Im Fehlerfall beenden Sie das Programm kontrolliert mit exit(1). Den Fehlercode '1' überprüfen die Tests in tests/output.bats!
|
|
|
|
|
|
230
|
+ >Wichtig: Im Fehlerfall beenden Sie das Programm kontrolliert mit exit(1).
|
|
|
|
231
|
+ >Den Fehlercode '1' überprüfen die Tests in tests/output.bats!
|
|
160
|
|
232
|
|
|
161
|
-3. Erstellen Sie eine eigene Datenstruktur und Methoden um die Aufgabe zu lösen. Verwenden Sie nur die externe Crate *procinfo* dazu. Die Ausgabe beim Aufruf Ihres Programms muss dieses Format haben:
|
|
|
|
|
|
233
|
+1. Erstellen Sie eine eigene Datenstruktur und Methoden um die Aufgabe zu lösen.
|
|
|
|
234
|
+ Verwenden Sie nur die externe Crate *procinfo* dazu. Die Ausgabe beim Aufruf
|
|
|
|
235
|
+ Ihres Programms muss dieses Format haben:
|
|
162
|
|
236
|
|
|
163
|
```text
|
237
|
```text
|
|
164
|
systemd(1)---sshd(1264)---sshd(7161)---sshd(7198)---zsh(7199)---cargo(47150)---task2(47151)
|
238
|
systemd(1)---sshd(1264)---sshd(7161)---sshd(7198)---zsh(7199)---cargo(47150)---task2(47151)
|
|
165
|
```
|
239
|
```
|
|
166
|
- > Je nachdem wie Sie Ihr Programm aufrufen wird es natürlich andere Ausgaben produzieren. Durch das Kommandozeilen-Tool **pstree** können Sie Ihre Ausgabe kontrollieren!
|
|
|
|
|
|
240
|
+ > Je nachdem wie Sie Ihr Programm aufrufen wird es natürlich andere Ausgaben
|
|
|
|
241
|
+ > produzieren. Durch das Kommandozeilen-Tool **pstree** können Sie Ihre
|
|
|
|
242
|
+ > Ausgabe kontrollieren!
|
|
167
|
|
243
|
|
|
168
|
-4. Schreiben Sie eine eigene unit Test Datei `unit_test_pstree.rs`, die Ihre Funktionen im Modul `pstree.rs` geeignet testet und beim Aufruf von **cargo test** die Tests ausführt.
|
|
|
|
|
|
244
|
+1. Schreiben Sie eine eigene unit Test Datei `unit_test_pstree.rs`, die Ihre
|
|
|
|
245
|
+ Funktionen im Modul `pstree.rs` geeignet testet und beim Aufruf von **cargo
|
|
|
|
246
|
+ test** die Tests ausführt.
|
|
169
|
|
247
|
|
|
170
|
-5. Schreiben Sie ausreichend Kommentare, um Ihre Implementierung in `pstree.rs` über die per **cargo doc** erstellten Dokumentation nachvollziehen zu können.
|
|
|
|
|
|
248
|
+1. Schreiben Sie ausreichend Kommentare, um Ihre Implementierung in `pstree.rs`
|
|
|
|
249
|
+ über die per **cargo doc** erstellten Dokumentation nachvollziehen zu können.
|
|
171
|
|
250
|
|
|
172
|
## Kontrolle Ihres Repositories
|
251
|
## Kontrolle Ihres Repositories
|
|
173
|
|
252
|
|
|
174
|
-Haben Sie die Aufgaben komplett bearbeitet, so sollten sich folgende Dateien in Ihrem HW (Homework) Verzeichnis befinden:
|
|
|
|
|
|
253
|
+Haben Sie die Aufgaben komplett bearbeitet, so sollten sich folgende Dateien in
|
|
|
|
254
|
+Ihrem HW (Homework) Verzeichnis befinden:
|
|
175
|
|
255
|
|
|
176
|
```text
|
256
|
```text
|
|
177
|
.
|
257
|
.
|
|
|
|
|
|
|
190
|
2 directories, 9 files
|
270
|
2 directories, 9 files
|
|
191
|
```
|
271
|
```
|
|
192
|
|
272
|
|
|
193
|
-
|
|
|
|
194
|
-
|
|
|
|
195
|
[Referenz]: http://www.linux-praxis.de/lpic1/lpi101/proc.html
|
273
|
[Referenz]: http://www.linux-praxis.de/lpic1/lpi101/proc.html
|
|
196
|
[procinfo]: https://docs.rs/procinfo/0.3.1/procinfo/
|
274
|
[procinfo]: https://docs.rs/procinfo/0.3.1/procinfo/
|
|
197
|
[io::Result]: https://doc.rust-lang.org/std/io/type.Result.html
|
275
|
[io::Result]: https://doc.rust-lang.org/std/io/type.Result.html
|