PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Ähnliche Dokumente
PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Linux Prinzipien und Programmierung

Was ist ein Prozess?

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Systemprogrammierung

2Binden 3. und Bibliotheken

Dämon-Prozesse ( deamon )

fork () Hans-Georg Eßer, Hochschule München Betriebssysteme I, SS Prozesse (2/2) Folie 4

Übung 1 - Betriebssysteme I

2A Basistechniken: Weitere Aufgaben

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

PROGRAMMIEREN MIT UNIX/Linux-SYSTEMAUFRUFEN

Betriebssysteme. Dipl.-Ing.(FH) Volker Schepper

Prozesse. Stefan Janssen. Alexander Sczyrba

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes

3. Unix Prozesse. Betriebssysteme Harald Kosch Seite 57

Einführung in die Systemprogrammierung unter Linux

Einige Eigenschaften der Bourne-Shell und der bash

Betriebssysteme (BS)

Klausur: Grundlagen der Informatik I, am 05. Februar 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

UNIX - LINUX. Prozesse. Überblick. Prozesse: Start. Prozesszustände. Prozesskontrollblock (Prozesssteuerblock) Prozesszustände

Prozesse. Prozesskonzept. Prozess- ein Programm in Ausführung

Übungspaket 19 Programmieren eigener Funktionen

Übungspaket 23 Mehrdimensionale Arrays

Systemprogrammierung.: unter Linux :.

GI Vektoren

2.2 Prozesse in Java

8. Referenzen und Zeiger

2 Funktionen für die Verwaltung von Kontexten

Systemprogrammierung I - Aufgaben zur Erlangung der Klausurzulassung für Informatiker und Wirtschaftsinformatiker

Repetitorium Informatik (Java)

Programmieren in C (Übungsblatt 1)

Kap. 2. Prozesse. Version vom Kap. 2 - Inhalt. Definition Prozeßzustände Threads Scheduling Beispiele. Folie 2

Dateizugriff unter C

Systemprogrammierung: Erste Schritte (P) Das Manpage-System (P) Versionsverwaltung mit Subversion (P)

Betriebssysteme Kapitel E : Prozesse

Schleifenanweisungen

FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren

Bash-Scripting Linux-Kurs der Unix-AG

Beispiel. Problem: mehrteilige Nachnamen (von Goethe, Mac Donald, Di Caprio)

Die Ausführung geschieht über die sequentielle Abarbeitung der Instruktionen.

Softwaresysteme I Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2007 U9.fm

Übungspaket 23 Mehrdimensionale Arrays

Prozesse: Prozesskontrollblock, -zustände, -umschaltung

Einführung zum MS Visual Studio

Einstieg in die Informatik mit Java

5 Speicherverwaltung. bs-5.1 1

Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

Institut für Informatik und Angewandte Kognitionswissenschaften

Fallbeispiel Unix. Betriebssysteme WS 14/15. Hermann Härtig TU Dresden

Einführung: Zustandsdiagramme Stand:

Übung: Entwickeln eines Shell-Skripts

Grundlagen der Informatik 11. Zeiger

Programmierung mit C Zeiger

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

1. Aufgabenblatt Unix

Welche Informatik-Kenntnisse bringen Sie mit?

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans...

Einstieg in die Informatik mit Java

Übungen zu Systemprogrammierung 1 (SP1)

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

Übung 4: Schreiben eines Shell-Skripts

Übung zur Vorlesung Programmieren in C

Echtzeitbetriebssysteme (am Beispiel QNX) Dr. Stefan Enderle HS Esslingen

Lösungsvorschlag zu 1. Übung

Beispiel für einen IPC-Server, der seinen Dienst über den Global Name Service im Netzwerk bekannt gibt. Header-Dateien einbinden

Ausgewählte Themen. In diesem Teil werden ausgewählte Themen vorgestellt: Fehlerbehandlung Dämonen Zombies. Inhalt. 1. Fehlerbehandlung...

Grundlagen der Fortran Sprache

Linker: Adreßräume verknüpfen. Informationen über einen Prozeß. Prozeß-Erzeugung: Verwandtschaft

Aufgabenblatt 1: - Präsenzübung für die Übungen Do Mi Ausgabe Mi

Übungen zu C++ Kapitel 1

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Prozesse und Threads. Prozess. Trace. Einfachstes Prozessmodell. Traces

Die Ausführung geschieht über die sequentielle Abarbeitung der Instruktionen.

Shell-Scripting Linux-Kurs der Unix-AG

Lösung Übungszettel 6

Systemnahe Software (Systemnahe Software II)

HTTP-Server. Frank Wübbeling Universität Münster

Prozesse, Logs und Systemverwaltung

Einführung in die Programmierung Wintersemester 2011/12

Prozesse. Vorlesung Betriebssysteme I. Zustandsmodell eines Prozesses. Virtuelle vs. reale CPU. Zustandsübergänge cont d

Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.

Transkript:

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN 2. UNIX/Linux-Prozessverwaltung und zugehörige Systemaufrufe Wintersemester 2016/17

2. Die UNIX/LINUX-Prozessverwaltung Aufgaben: 1. Erzeugen neuer Prozesse 2. Laden u. Ausführen von Prozessen 3. Selbstbeenden bzw. Abbrechen von Prozessen 4. Warten auf andere Prozesse (bzw. auf Ereignisse oder Signale) 2.1 Systemaufrufe der UNIX/LINUX-Prozessverwaltung wichtigste davon: fork( ) exec*(...) exit(...) wait(...) erzeugt neuen Prozess durch (fast vollständiges) Klonen des aufrufenden Prozesses aufrufender Prozess wechseltvon ihm ausgeführtes Programm [* Es existieren verschiedene Varianten, die durch nach exec folgende(s) Zeichen unterschieden werden.] Selbstbeendigung des aufrufenden Prozesses aufrufender Prozess wartet auf(beliebigen) Kindprozess 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... ws 2016/17 H.-A. Schindler Folie: 2-2

UNIX/LINUX-Prozessverwaltung: Prozess-Erzeugung spezielles Konzept (anders als bei anderen Betriebssystemen) jeder Prozess hat Elternprozess( parentprocess ) und ist selbst Kindprozess( child process ) (Ausnahme: Urprozess 0... ein Systemprozess) damit existieren Prozesse stets in Prozesshierarchien parent Ur- Prozess child(ren) grand-child(ren) 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / fork( ) ws 2016/17 H.-A. Schindler Folie: 2-3

UNIX/LINUX-Prozessverwaltung: Systemaufruf fork() Syntax: rw = fork( ) (parameterlos) Rückkehrwert Wirkungsweise: erzeugt neuen Prozess durch Klonen des aufrufenden Prozesses dabei alle Prozessbestandteile dupliziert!!(mit ganz wenigen aber sehr wichtigen Ausnahmen!!) Ausnahmen: Prozess-ID: Kind erhält (selbstverständlich!) eigenen Prozess-Identifikator Rückkehrwert rw des Systemaufrufs rw = fork( ) : rw = 0... Kindprozess rw = <pid des Kindes>... Elternprozess rw = -1 parent child fork... Fehler, Systemaufruf konnte nicht ausgeführt werden 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / fork( ) ws 2016/17 H.-A. Schindler Folie: 2-4

UNIX/LINUX-Prozessverwaltung: Systemaufruf fork() Verwendung im Programm (Prinzip): #include <unistd.h> int <rw_fork>; 7 <rw_fork> = fork(); (ohne Parameter) Konkretes Beispiel: #include <unistd.h> int ab; 7 ab = fork(); Variable Symbol Typ Bedeutung Wert <rw_fork> int Rückkehrwert Interpretation 0 O.K. nur als Wert der Variablen rw_forkbei Childprozessmöglich (hieran erkennt Childprozess sich sebst) >0 O.K. Variablenwert bei Parentprozess (Wert ist Prozess-ID des gerade erzeugten Childprozesses) -1 Feh- (nur bei Parentprozess möglich); ler fork() wurde nicht ausgeführt 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / fork( ) ws 2016/17 H.-A. Schindler Folie: 2-5

Beispielprogramm 3.c #include <unistd.h> #include <stdio.h> main() { if(fork() == 0) { // Kind-Prozess printf("ich bin der Kind-Prozess. - Ich heisse: %d\n",getpid()); printf("mein Vater (oder meine Mutter?) heisst: %d\n\n",getppid()); M: gotom; } else { // Eltern-Prozess printf("\nich bin der Eltern-Prozess. - \ Meine Identifikationsnummer ist: %d\n\n", getpid()); } wait(); printf("hier ist wieder der Eltern-Prozess.\ \nendlich brauche ich nicht mehr auf mein Kind zu warten!\n\n"); } 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / fork( ) ws 2016/17 H.-A. Schindler Folie: 2-6

UNIX/LINUX-Prozessverwaltung: Systemaufruf exec*(..) soll ein Prozess ein anderes Programm ausführen, ist nach fork() noch der exec*( )-Systemaufruf anzuwenden (von to execute... ausführen) exec*( ) überschreibt Daten-u. Textbereich mit den entsprechenden Teilen des spezifizierten (ausführbaren) Programms Nach der (erfolgreichen!) Ausführung von exec*() führt ein Prozess ein anderes Programm aus!! Prozess-Attribute Stack (Kern-Modus) Programmcode initialisierte Daten nicht initialis. Daten Stack (Nutzermodus) Prozessliste BS-Bereich Prozess- Bereich Text- Daten- Prozessdeskriptor (Prozesskontrollblock) exec*( neues Programm ) aus neuem Programm Programmcode initialisierte Daten nicht initialis. Daten Prozessattribute Stack (Kern-Modus) Programmcode initialisierte Daten nicht initialis. Daten Stack (Nutzermodus) Prozessliste BS-Bereich Prozess- Bereich Text- Daten- 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / exec*( ) ws 2016/17 H.-A. Schindler Folie: 2-7

UNIX/LINUX-Prozessverwaltung: Systemaufruf exec*(..) Prozessdeskriptor (Prozesskontrollblock) PCB Prozess-Attribute Prozessliste Prozessattribute Prozessliste Stack (Kern-Modus) Programmcode initialisierte Daten nicht initialis. Daten Stack (Nutzermodus) BS-Bereich Prozess- Bereich Text- Daten- exec*( neues Programm ) aus neuem Programm: Programmcode initialisierte Daten nicht initialis. Daten Stack (Kern-Modus) Programmcode initialisierte Daten nicht initialis. Daten Stack Ausführbares (Nutzermodus) Programm: heute im ELF-Format (siehe gleichfalls 2. Übung) BS-Bereich Text- Daten- 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / exec*( ) ws 2016/17 H.-A. Schindler Folie: 2-8

UNIX/LINUX-Prozessverwaltung: Systemaufruf exec*(..) Verwendung im Programm (Prinzip): int <rw_exec>; 7 <rw_exec> = execl( <pfad>/<program>, <program>, 0); Konkretes Beispiel: int c; 7 c = execl( d1/p1, p1, 0); Variable Symbol Typ Bedeutung Wert <rw_exec> int <pfad> <program> Rückkehrwert absoluter oder relativer Pfadname Programmname (letzte Komponente im Pfad) 0 Stringabschluss Interpretation -1 Feh- exec*(7) nicht ausgeführt; bei erfolgler reicher Ausführung rw_exec nicht mehr zugänglich 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / exec*( ) ws 2016/17 H.-A. Schindler Folie: 2-9

UNIX/LINUX-Prozessverwaltung: Systemaufruf wait(..) Verwendung im Programm (Prinzip): int <rw_wait>, <status>; 7 <rw_wait> = wait(&<status>); Konkretes Beispiel: int x, z; 7 x = wait(&z); Variable Symbol Typ Bedeutung Wert <rw_wait> int Rückkehrwert Interpretation >0 O.K. Prozess-ID des Childprozesses, der beendet wurde -1 Feh- es existierte kein Childprozess ler <status> Status des Childprozesses & Adress-Symbol 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / wait( ) ws 2016/17 H.-A. Schindler Folie: 2-10

Beispielprogramm 5.c #include <unistd.h> #include <stdio.h> main() { if (fork() == 0) { // child proc printf("kindprozess\n\n"); execl("/usr/bin/test","test", NULL); printf("systemaufruf execl(): fehlgeschlagen\n\n"); } else { // parent proc printf("\nelternprozess\n\n"); } wait(); } 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / wait( ) ws 2016/17 H.-A. Schindler Folie: 2-11

Aufgabenstellung: 1. Studieren Sie das einfache C-Programm 1.c. Übersetzen Sie dieses mit dem C-Compiler und führen Sie anschließend das übersetzte Programm aus. Wie sind die dabei erfolgten Ausgaben, insbesondere deren Anzahl zu erklären? 2. Falls Sie keine befriedigende Erklärung finden, verwenden Sie in gleicher Weise das Programm 2.c. Der parameterlose Systemaufruf getpid() liefert die Prozess-Nr. (= Prozess-Identifikator pid) des aufrufenden Prozesses. 3. Verfahren Sie mit Programm 3.c analog zu 1.c bzw. 2.c. Untersuchen Sie dann die durch das UNIX-Kommando ps (z.b. in der Form ps al ) aufgelisteten Prozesse mit ihren Parametern und interpretieren Sie die erfolgten Ausgaben! Brechen Sie dann mit dem UNIX-Kommando kill -9 <Prozess-Nummer> den Kindprozess ab. Interpretieren Sie die dadurch erfolgte Ausgabe und überprüfen Sie nochmals mit ps die noch existierenden Prozesse. 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / Aufgabenstellung ws 2016/17 H.-A. Schindler Folie: 2-12

Aufgabenstellung: 4. Übersetzen Sie jetzt das Programm 5.c und führen Sie es aus! Warum funktioniert der execl()-systemaufruf nicht? 5. Erzeugen Sie jetzt in bekannter Weise aus dem C-Programm 4.c ein ausführbares Programm, welches (z.b.) TEST heißen soll. Korrigieren Sie dann in 5.c den im Systemaufruf execl(..) enthaltenen Pfadnamen unter dem das ausführbare Programm TEST zu erreichen ist. Nach der Korrektur erzeugen Sie aus 5.c wieder ein ausführbares Programm und starten dieses. Interpretieren Sie die erfolgten Ausgaben! 6. Studieren Sie noch Programm 6.c und experimentieren Sie! 7. Sie können sich zur vorliegenden Thematik weitere Experimente ausdenken und durchführen. 2. UNIX/Linux-Prozessverwaltung / 2.1 Systemaufrufe... / Aufgabenstellung ENDE 2 ws 2016/17 H.-A. Schindler Folie: 2-13