Beispiel 2. Verwandte Prozesse: fork, exec, wait Interprozesskommunikation mit Unnamed Pipes. Denise Ratasich. 11. April Verwandte Prozesse IPC

Ähnliche Dokumente
Beispiel Block 2. Oliver Höftberger SS Parallele Prozesse: fork, exec und wait Interprozesskommunikation mit Unnamed Pipes

Beispiel Block 2. Oliver Höftberger WS Parallele Prozesse: fork, exec und wait Interprozesskommunikation mit Unnamed Pipes

Beispiel Block 2 Stream I/O Parallele Prozesse: fork, exec und wait Interprozesskommunikation mit Unnamed Pipes

Beispiel Block 2 Stream I/O Parallele Prozesse: fork, exec und wait Interprozesskommunika>on mit Unnamed Pipes. Benedikt Huber WS 2011/2012

Systemnahe Programmierung in C Übungen Jürgen Kleinöder, Michael Stilkerich Universität Erlangen-Nürnberg Informatik 4, 2011 U7.fm

U7 POSIX-Prozesse U7 POSIX-Prozesse

G 5. Übung. G-1 Überblick. Besprechung 3. Aufgabe. Infos zur Aufgabe 5: fork, exec. Rechenzeiterfassung. Ü SoS I G.1

Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014

Tafelübung zu BS 1. Prozesse, Shell

Was ist ein Prozess?

Tafelübung zu BS 1. Prozesse, Shell

Tafelübung zu BSRvS 1 1. Prozesse, at

U3 UNIX-Signale U3 UNIX-Signale

Tafelübung zu BS 1. Prozesse, ToothBrush

Tafelübung zu BS 1. Prozesse, ToothBrush

Tafelübung zu BS 1. Prozesse verwalten

Fortgeschrittene I/O

Übungen zu Systemprogrammierung 2 (SP2)

Tafelübung zu BS 1. Prozesse verwalten

U6 POSIX-Prozesse. U6-1 Prozesse: Überblick. U6-1 UNIX-Prozesshierarchie. U6-2 POSIX Prozess-Systemfunktionen. Prozesse

Betriebssysteme: UNIX-Operationen zur Prozesskontrolle

Übungen zu Systemprogrammierung 2 (SP2)

4.4 Prozesse. H. Weber, HS RM SS 2010 Systemprogrammierung Kap. 4.4 Seite 1 von 22

Tafelübung zu BS 1. Prozesse verwalten

Übungsbesprechung Blatt 3 Vorlesung Betriebssysteme I (WS 2018/19) Operating Systems And Middleware Group

Übungen zu Systemprogrammierung 2 (SP2)

Grundsätzliche Fragestellung. Grundsätzliche Fragestellung. Weitere Fallstricke. Bibliotheksfunktionen. ? Welche Art von Nebenläufigkeit liegt vor?

Linux Prinzipien und Programmierung

Das Signalkonzept (T) Signale und Signalbehandlung (P)

Betriebssysteme. A1- Prozesse. Olaf Spinczyk.

Übungen zur Systemprogrammierung 1 Michael Golm, Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4,

Betriebssysteme. A1- Prozesse. Olaf Spinczyk.

1 wsort - Datenstrukturen (1. Möglichkeit) 3 Speicherverwaltung. Besprechung Aufgabe 2. dynamische Speicherallokation vs.

Betriebssysteme. Einführung C. Olaf Spinczyk.

1 wsort - Datenstrukturen (1. Möglichkeit)

Klausur Betriebssysteme I

Eine Mini-Shell als Literate Program

Probeklausur zu Systemnahe Software II SS 2012 Dr. Andreas Borchert mit Markus Schnalke

Aufgabenblatt 5 Musterlösung

Interprozesskommunikation

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

Klausurdeckblatt. Name: Studiengang: Matrikelnummer:

U23 - Shellcode. Twix Chaos Computer Club Cologne. Motivation Einstieg Der erste Shellcode Nullbytes, NOP Slides

Prozesse. Netzwerk - Programmierung. Alexander Sczyrba Madis Rumming

Die Zustellung von Signalen 100

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Netzwerk-Programmierung. Prozesse. Alexander Sczyrba Michael Beckstette.

Aufbau einer Pipeline 124

Allgemeines. Shell Programmierung Unix. Kommentar. Vorgangsweise. Mag. Thomas Griesmayer

Gute Software erkennt Fehler, führt eine angebrachte Behandlung durch und gibt eine aussagekräftige Fehlermeldung aus

Homogene Multi-Core-Prozessor-Architekturen

Institut für Informatik der Ludwig-Maximilians-Universität München Systempraktikum Wintersemester 2009/2010 Prof. Dr. Dieter Kranzlmüller Dr. Thomas S

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

Betriebssysteme (BS) Inhalt. Prozesse. Olaf Spinczyk.

Kommunikationsmuster (T) Interprozesskommunikation (T) Kommunikation über Pipes (P) Parserspezifikation und -generierung (P)

Einführung in die Programmiersprache C

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Prozesshierarchie. Prozesse. UNIX-Prozesshierarchie

Klausur Systemprogrammierung I Februar Klausur Systemprogrammierung I Februar 2001

Betriebssysteme (BS)

Betriebssysteme Teil 3: Systemaufrufe für Prozesse

Zusammenfassung für CS-Prüfung 3 Seite 1. CS-Zusammenfassung für Prüfung 3 vom Im Beispiel gibt es 3 Deadlocks

Malware. Carlo U. Nicola 09. Dezember Die Struktur eines (harmlosen) aber echten Virus-Programmes analysieren;

Abbildung 3.1: Aufbau einer Pipeline

Programme und Prozesse

Die Mini Shell "Mishell"

f) Welcher UNIX-Systemaufruf wird bei der Verwendung von Sockets auf keinen Fall gebraucht? (1 Punkt) close() bind() listen() open()

Lösung zur Praktikumsaufgabe 9

U3 UNIX-Signale U3 UNIX-Signale

Threads. Foliensatz 8: Threads Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Klausur Betriebssysteme I

Tafelübung zu BS 5. Dateioperationen

Michael Golm, Universität Erlangen-Nürnberg, IMMD 4, 1999/ / Tafelübung 5. Prozeß2 Prozeß3. Kernel

Systemprogrammierung

Tafelübung zu BS 4. Dateioperationen

Betriebssysteme, WS 2015/16, Hans-Georg Eßer

Systemnahe Software WS 2006/2007

Kommunikation von Prozessen: Signale und Pipes

Lösung Übungszettel 6

Teil I Debuggen mit gdb

U9-1 Prozesse: Überblick. U9-1 UNIX-Prozesshierarchie. U9-2 POSIX Prozess-Systemfunktionen. Prozesse sind eine Ausführumgebung für Programme

Lösung zur Praktikumsaufgabe 1

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

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

3. Unix Prozesse. Betriebssysteme Harald Kosch Seite 57

Lab 3 User Level Threads

Betriebssysteme (BS) Prozesse. Olaf Spinczyk.

I 7. Übung. I-1 Überblick. Besprechung Aufgabe 5 (mysh) Online-Evaluation. Posix Threads. Ü SoS I I.1

Betriebssysteme (BS)

Prozesse and Threads WS 09/10 IAIK 1

FILE *fp; char fname[100];... fp = fopen (fname, rb ); if( fp == NULL ) { perror( fopen );... } // Fehlernachricht auf letzten Fehler, der aufkam

Shared-Memory Programmiermodelle

Transkript:

e eigenschaften Beispiel 2 e: fork, exec, wait Interprozesskommunikation mit Unnamed Denise Ratasich basierend auf Slides von Daniel Prokesch Institut für Technische Informatik Technische Universität Wien 11. April 2016 1

2 Beispiel 2 Überblick e eigenschaften e (fork) abbild (exec) Auf Beendigung eines es warten (wait)

image im Hauptspeicher e eigenschaften Quelle: Wilfried Elmenreich - Systemnahes ieren; C ierung unter Unix und Linux. Reichardt Verlag 2007. p. 55 3

4 Beispiel 2 eigenschaften Linux (1) e eigenschaften Zustand Running, Waiting,... Scheduling Priorität, CPU-Zeit,... Identifikation PID, Owner, Gruppe,... Speicherverwaltung Pointer auf MMU Info Signale Mask, Pending verwandtschaften Parents, Siblings

eigenschaften Linux (2) e eigenschaften Process Control Block Register, PC, Statuswort, Segmentregister, Page Info Kernelstack Dateideskriptorentabelle Berechtigungen, Accounting Information Timerverwaltung Interprozesskommunikation Siehe: struct task_struct in sched.h 5

hierarchie e eigenschaften Jeder hat Elternprozess Ausnahme: Init- (init, systemd) Jeder hat eine eindeutige ID (pid_t) hierarchie anzeigen: pstree(1) systemd-+-modemmanager---2*[{modemmanager}] -NetworkManager-+-dhclient -2*[{NetworkManager}] -abrt-dbus---{abrt-dbus} -2*[abrt-watch-log] -abrtd -acpid -agetty -alsactl -atd -auditd-+-audispd-+-sedispatch -{audispd} -{auditd} -automount---7*[{automount}] -avahi-daemon---avahi-daemon -chronyd -colord---2*[{colord}] -crond -cupsd -dbus-daemon -dnsmasq---dnsmasq -firewalld---{firewalld}.. 6

7 Beispiel 2 e eigenschaften e Überblick e werden üblicherweise mit fork(2) erzeugt exec(3) überschreibt das aktuelle image mit einem neuen image wait(3) wartet auf die Terminierung eines Kindes

e eigenschaften Interface fork / exec / exit / wait fork() erzeugt neuen (Kind-) exec*( programm ) ersetzt image eines es durch ein neues exit(status) beendet wait*(&status) wartet auf die Beendigung eines es 8

9 Beispiel 2 e eigenschaften fork Funktion fork() Erzeugt einen neuen Neuer ist eine identische Kopie des aufrufenden es bis auf PID, pending signals,... Erzeugender ist Elternprozess des erzeugten es e sind verwandt Beide e laufen parallel und führen dasselbe aus

e eigenschaften Vor fork() Nach fork() 10

11 Beispiel 2 e eigenschaften fork : #include <unistd.h> pid_t fork(void); Unterscheidung zwischen Eltern- und durch den Rückgabewert -1 im Fehlerfall 0 im (child) >0 im Elternprozess (parent)

12 Beispiel 2 e eigenschaften Beispiel pid_t pid = fork(); switch (pid) { case -1: (void) fprintf(stderr, "Cannot fork!\n"); exit(exit_failure); } case 0: // child tasks... break; default: // parent tasks... break;

e eigenschaften Eigenschaften erbt vom Elternprozess offene Dateien (gemeinsamer Zugriff!) Dateipuffer Signalbehandlung momentane Variablenwerte Jedoch gilt: Variablen sind lokal (keine Beeinflussung) Signalbehandlung kann rekonfiguriert werden Kommunikation () via, Sockets, Shared Memory,... 13

14 Beispiel 2 e eigenschaften exec Funktion exec() Erlaubt es einem, ein anderes auszuführen Startet ein neues innerhalb eines es PID bleibt gleich

e eigenschaften Die exec() Familie (1) int execl(const char *path, const char *arg,...); int execlp(const char *file, const char *arg,...); int execle(const char *path, const char *arg,..., char *const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int fexecve(int fd, char *const argv[], char *const envp[]); 15

e eigenschaften Die exec() Familie (2) Ersetzt aktuelles durch das in der Datei path enthaltene exec*p Variante sucht (wie Shell) in $PATH nach mit dem spezifierten Namen Argumentübergabe beachten! 1. Argument ist name (argv[0]) Argumentliste muss mit NULL Zeiger enden Varianten mit variable Argumentanzahl (execl*) und Argumentarray (execv*) Variante execle: Environment 1 kann verändert werden Variante fexecve: akzeptiert Dateideskriptor 1 FYI: environ(7) 16

17 Beispiel 2 e eigenschaften Beispiel: execv(), execvp() #include <unistd.h> char *cmd[] = { "ls", "-l", (char *) 0 }; (void) execv ("/bin/ls", cmd); (void) execvp ("ls", cmd); error_exit("cannot exec")

e eigenschaften Beispiel: execl(), execlp() #include <unistd.h> (void) execl ( "/bin/ls", "ls", "-l", NULL ); // or (void) execlp ( "ls", "ls", "-l", NULL ); error_exit("cannot exec") 18

19 Beispiel 2 e eigenschaften Erinnerung: exit Funktion exit() Beendet den aktuellen Rückgabewert kann von Elternprozess abgefragt werden Beim Beenden Leeren der stdio-puffer Schließen offener Dateien Löschen von temporären Dateien (tmpfile(3)) Aufrufen von Exit-Handlern (atexit(3))

e eigenschaften exit normal : #include <stdlib.h> void exit(int status); Status: 8 bit (0-255) Im C-Standard definierte Rückgabewerte: exit(exit_success) keine Fehler exit(exit_failure) Fehler aufgetreten Weitere Rückgabewerte BSD: sysexits.h http://tldp.org/ldp/abs/html/exitcodes.html 20

21 Beispiel 2 e eigenschaften Auf warten wait Funktion wait() Wartet bis ein terminiert Liefert PID und Status des beendeten es

22 Beispiel 2 e eigenschaften Auf warten wait Auf Beendigung eines es warten #include <sys/wait.h> pid_t wait(int *status); Rückgabewert: PID des terminierten es, bzw. -1 im Fehlerfall ( errno, u.a. ECHILD) Status des es beinhaltet Exit-wert und Signalinformation WIFEXITED(status), WEXITSTATUS(status) WIFSIGNALED(status), WTERMSIG(status) Siehe wait(2) Nach dem Aufruf von wait() wird der aus der tabelle entfernt

e eigenschaften Auf warten Zombies und Orphans UNIX: Auch bereits terminierte e besetzen einen Eintrag in der tabelle Falls kein Platz mehr frei ist, kann kein neuer gestartet werden Zombie Der terminiert und der Elternprozess hat noch nicht wait aufgeführt Der wird auf den Zustand Zombie gesetzt gestartet werden Eintrag in der tabelle bleibt erhalten, bis der Elternprozess wait ausführt Orphan Der Elternprozess terminiert und der wurde noch nicht beendet Der verwaist und wird dem Init vererbt Nach Beendigung eines Orphans entfernt Init den eintrag 23

e eigenschaften Auf warten Beispiel: wait #include <sys/wait.h> int status; pid_t child_pid, pid;... while ((pid = wait(&status))!= child_pid) { if (pid!= -1) continue; // other child if (errno == EINTR) continue; // interrupted error_exit("cannot wait"); } if (WEXITSTATUS(status) == EXIT_SUCCESS) {... wait() stoppt ausführung bis entweder ein terminiert oder ein Fehler auftritt ( busy waiting) 24

e eigenschaften Auf warten waitpid() Auf Beendigung eines es mit einer bestimmten PID warten #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options); Beispiele: waitpid(-1, &status, 0); // aequivalent zu wait waitpid(cid, &status, 0); // wartet auf Kind mit PID cid waitpid(-1, &status, WNOHANG); // blockiert nicht 25

e eigenschaften Benachrichtigung bei Terminierung eines es Falls nicht blockiert werden soll Synchron waitpid(-1, &status, WNOHANG) Holt Exit-Status falls ein Kind beendet wurde Wiederholter Aufruf Polling Asynchron Wenn ein beendet wurde, wird das Signal SIGCHLD an den Elternprozess gesendet Installieren eines Signalhandlers (sigaction) Aufruf von wait im Signal-Handler 26

27 Beispiel 2 Fallstricke e eigenschaften int main(int argc, char **argv) { (void) fprintf(stdout, "Hallo"); } (void) fork(); return 0; Ausgabe: HalloHallo Warum?

Fallstricke e eigenschaften int main(int argc, char **argv) { (void) fprintf(stdout, "Hallo"); (void) fflush(stdout); (void) fork(); return 0; } Ausgabe: Hallo gilt für alle geöffneten Streams 28

29 Beispiel 2 e eigenschaften Debugging gdb Bevor fork ausgeführt wird: set follow-fork-mode [child parent] Zum Beispiel (debuggen von forktest): $ gdb -tui./forktest (gdb) break main (gdb) set follow-fork-mode child (gdb) run (gdb) next (gdb) : (gdb) continue (gdb) quit

e eigenschaften Überblick (Unnamed) Pipe = Unidirektionaler Interprozesskommunikationskanal Ermöglicht Kommunikation zwischen verwandten en Eigenschaften: Zugriff auf Lese- und Schreibende mittels Filedeskriptoren Stream von Daten gepuffert implizite Synchronisation 30

e eigenschaften Erzeugung Erzeugen einer Pipe #include <unistd.h> int pipe(int pipefd[2]); Die File-Deskriptoren des Lese- und des Schreibendes werden im übergebenen Integer-Array retourniert Deskriptor pipefd[0] ist Leseende Deskriptor pipefd[1] ist Schreibende Ein danach mit fork() erzeugter erbt die File-Deskriptoren gemeinsamer Zugriff Nicht verwendete Enden werden geschlossen Weitere Nutzung z.b. mittels Stream-IO (fdopen, etc.) 31

e eigenschaften Unnamed Illustration 32

e eigenschaften Unnamed Synchronisation Implizite Synchronisation Lesen von leerer Pipe ist blockierend Schreiben auf volle Pipe ebenso Lesen von Pipe ohne offene Schreibenden liefert EOF Schreiben auf Pipe ohne offene Leseenden erzeugt Signal SIGPIPE (bei Signalbehandlung: write() returniert -1 mit errno EPIPE) Deshalb...... immer nicht benötigte Enden schließen, um dieses Verhalten (EOF bzw. SIGPIPE/EPIPE) sicherzustellen. Außerdem: Kernel entfernt Pipe sobald alle Enden geschlossen sind 33

e eigenschaften Figure 5-2 illustrates the relationship between file descriptors, open file descriptions, Descriptor and i-nodes. In this diagram, two processes have a number of open file File descriptors. Process A File descriptor table fd 0 fd 1 fd 2 fd 20 fd flags file ptr Process B File descriptor table fd 0 fd 1 fd 2 fd 3 fd flags file ptr 0 23 73 file offset Open file table (system-wide) status flags inode ptr 224 1976 86 5139 I-node table (system-wide) file type file locks... Figure 5-2: Relationship between file descriptors, open file descriptions, and i-nodes Quelle: Michael Kerrisk - The Linux ing Interface, p. 95 34

e eigenschaften Ein- und Ausgaben dup(), dup2() dup(oldfd) dupliziert den File-Deskriptor oldfd Der neue Deskriptor erhält die niedrigste, nicht verwendete ID, = Eintrag in der file descriptor table Duplizierter Deskriptor zeigt auf dieselbe open file description (file offset, status flags) siehe open(2) dup2(oldfd, newfd) Dupliziert oldfd, der neue Deskriptor erhält ID newfd Schließt vorher ggf. File-Deskriptor newfd 35

e eigenschaften Ein- und Ausgaben Anwendung Hauptanwendungsgebiet für Kommunikation mit Kommandozeilen-Utility über Standardeingabe und Standardausgabe Umleiten der Standardeingabe (0, STDIN_FILENO) oder Standardausgabe (1, STDOUT_FILENO) in neuem Schließen des Filedeskriptors für Standard I/O Duplizieren eines offenen Deskriptors (z.b. Pipeende) auf eben geschlossenen Schließen des duplizierten FDs 36

e eigenschaften Ein- und Ausgaben Beispiel #include <fcntl.h> #include <sys/types.h> #include <unistd.h> int fd; // TODO error handling! fd = open("log.txt", O_WRONLY O_CREAT); (void) dup2(fd, STDOUT_FILENO); (void) close(fd); // old descriptor // new descriptor (void) execlp("grep", "grep", "max", NULL); 37

e eigenschaften Unnamed Fallstricke eignen sich gut für unidirektionale Kommunikation Bidirektional: Zwei Fehleranfällige Synchronisation (deadlock) Synchronisation & Puffer fflush() verwenden Puffer konfigurieren (setbuf(3), setvbuf(3)) 38

Zusammenfassung e eigenschaften fork/exec/wait: Weitere e starten Unnamed : Kommunikation zwischen verwandten en Umleiten von Ein- und Ausgabe 39

Material e eigenschaften Wilfried Elmenreich: Systemnahes ieren C ierung unter Unix und Linux, Reichardt Verlag, 2007. Michael Kerrisk: A Linux and UNIX System ing Handbook, No Starch Press, 2010. man pages: fork(2), exec(3), wait(3), dup(2) gdb - Debugging Forks: https://sourceware.org/gdb/onlinedocs/gdb/ Forks.html 40