Was ist ein Prozess?

Ähnliche Dokumente
Linux Prinzipien und Programmierung

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

Tafelübung zu BS 1. Prozesse, Shell

Eine Mini-Shell als Literate Program

Betriebssysteme: UNIX-Operationen zur Prozesskontrolle

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

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

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

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

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

Prozesse. Netzwerk - Programmierung. Alexander Sczyrba Madis Rumming

Übersetzen von Projekten mit make(1) Aufgabe 3: clash (Einfache Shell im Eigenbau)

Klausur Betriebssysteme I

Bash-Skripting Linux-Kurs der Unix-AG

Bash-Skripting Linux-Kurs der Unix-AG

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

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

Netzwerk-Programmierung. Prozesse. Alexander Sczyrba Michael Beckstette.

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

Lösung zur Praktikumsaufgabe 1

Klausur Betriebssysteme I

2Binden 3. und Bibliotheken

Das Signalkonzept (T) Signale und Signalbehandlung (P)

Übung 1 - Betriebssysteme I

Aufgabenblatt 5 Musterlösung

Lösung Übungszettel 6

Subprozesse in Python

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

Shell-Scripting Linux-Kurs der Unix-AG

Shell-Scripting Linux-Kurs der Unix-AG

Bash-Scripting Linux-Kurs der Unix-AG

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

d) Welche Aussage zum Thema Adressräume ist richtig?

Systemprogrammierung

Prozesse, Logs und Systemverwaltung

7. Foliensatz Betriebssysteme

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Betriebssysteme (BS)

Grundlagen der Programmierung

Klausurdeckblatt. Name: Studiengang: Matrikelnummer:

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

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

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

Prüfung Betriebssysteme 1

Übung zu Grundlagen der Betriebssysteme. 6. Übung

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

FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren

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

UNIX/Linux Lösung. Mär 14, 17 20:40 Seite 1/6. Prozeßsynchronisation (was ist das?, wo kommt es vor?, Beispiel?):

Transkript:

Prozesse unter UNIX

Definition Was ist ein Prozess? Zeitliche Abfolge von Aktionen Ein Programm, das ausgeführt wird Prozesshierachie Baumstruktur INIT-Prozess ist die Wurzel (pid=1) und wird beim Booten erzeugt. Alle anderen Prozesse sind Nachfolger von INIT

Prozesshierachie init + acpid cron dhclient3 events/0 events/1 firefox bin + 6*[evince {evince}] java_vm 12*[{java_vm}] 10*[{firefox bin}] gdm gdm + Xorg x session manag ssh agent 4*[getty] gnome terminal + 9*[bash] 5*[bash ssh] bash pstree login bash vim login bash

Prozesshierachie fork Kernprozess (Prozess 0) /etc/init (Prozess 1) /etc/getty (Prozess i) /bin/login (Prozess i) Bash (Prozess i) erzeugt von Kernel fork /etc/getty (Prozess j) /bin/login (Prozess j) Bash (Prozess j) fork /etc/getty (Prozess k) /bin/login (Prozess k) Bash (Prozess k)...

Systemaufruf fork() Erzeugt einen neuen Prozess Nach Aufruf von fork() existieren 2 identische Prozesse, welche aber unabhängig voneinander ablaufen! Syntax: pid_t fork(); Rückgabewerte Beim Vaterprozess: Die PID des Kindprozesses Beim Kindprozess: 0 Fehler: -1

Systemaufruf wait() Wird im Vaterprozess benutzt Wartet auf das Beenden des Kindprozesses Syntax: pid_t wait(int *status); Rückgabewerte Die PID des Kindprozesses, der beendet wurde Fehler: -1

Systemaufruf wait() Der Exit-Status kann des Kindprozesses kann durch Makros ermittelt werden Makro WIFEXITED(status) WIFSGNALED(status) Bedeutung Ist TRUE, wenn sich ein Kindprozess beendet hat. Will man den genauen EXIT- Wert, so kann man ihn mit dem Makro WEXITSTATUS(status) erfragen Ist TRUE, wenn der Kindprozess durch ein Signal terminiert wurde, das dieser nicht abgefragt hat. Das genaue Signal kann durch das Makro WTERMSIG(status) abgefragt werden. Makros in <sys/wait.h>

Systemaufruf waitpid() Mit wait() kann allerdings nur auf die Beendigung des nächsten Prozesses gewartet werden. Mit waitpid() kann hingegen auf die Beendigung eines bestimmten Prozesses gewartet werden. Syntax: pid_t waitpid(pid_t pid, int *status, int optionen); Über das 3. Argument, optionen, kann das Verhalten von waitpid() beeinflusst werden. Folgende Möglichkeiten: WNOHANG Der Aufrufende Prozess wird nicht blockiert, wenn der Prozess >>PID<< noch nicht beendet bzw. noch nicht im Zombie-Status ist. waitpid() liefert in diesem Fall 0 zurück WUNTRACED Status des angehaltenen Kindprozesses

Systemaufruf () Überladen des aktuellen Prozesses mit neuem Code Mehrere Varianten von () l, lp, le, v und vp Die einzelnen Funktionen unterscheiden sich anhand der Endungen, wobei jeder Buchstabe folgende Bedeutung hat: Buchstabe Bedeutung e l v p Es wird eine Environmentliste (Umgebungsvariablen) als Vektor erwartet. Es werden Kommandozeilenargumente in Form einer Liste erwartet Es werden die Kommandozeilenargumente in Form eines Vektors erwartet Es wird ein Dateiname und nicht ein Pfadname als Argument zum Aufruf des Programms erwartet

() Das zweite Argument wird in der Prozesstabelle als Prozessname ausgegeben. Würde man z.b. folgendes schreiben: l( /bin/ls, wer_bin_ich, l, wd, NULL); wird trotzdem das Arbeitsverzeichnis aufgelistet. Als Prozessname, mit ps -f, würde allerdings der Name wer_bin_ich aufgelistet werden.

() Beispiele I ve. Das Beispiel ruft printenv auf und verändert die Umgebungsvariablen von diesem Prozess #include <stdio.h> #include <unistd.h> int main (void) { char *args[] = {"printenv", NULL}; char *env[] = { "SHELL=/bin/bash", "LOGNAME=a_username", "OSTYPE=L1NuX", NULL } }; return ve("/usr/bin/printenv", args, env);

() Beispiele II l Es werden Kommandozeilenargumente in Form einer Liste erwartet. Es werden keine Environmentvariablen übergeben. Stattdessen wird das aktuelle Environment benutzt. Beispiel: #include <stdio.h> #include <unistd.h> int main (void) { char *argumente[4] = { "ls", " l", "/usr/bin", NULL }; return v ("/bin/ls", argumente); }

() Beispiele III le ähnlich zu ve() - Alle Argumente werden in Listenform mit NULL gefolgt von den Umgebungsvariablen in Vektorform übergeben Beispiel: #include <stdio.h> #include <unistd.h> int main (void) { char *environment[4]; environment[0] = "SHELL=/bin/csh"; environment[1] = "LOGNAME=Wolfi"; environment[2] = "OSTYPE=LiNuX"; environment[3] = NULL; } return le("/usr/bin/ls", "ls", " d", "/tmp", "/", NULL, environment);

() Beispiele IV lp ähnlich zu ve() - Erstes Argument muss nicht, wie bei le, ein absoluter Dateiname sein Beispiel: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (void) { return lp ("/bin/ls", "ls", " l", getenv("home"), NULL); }

() Beispiele V vp ähnlich zu lp() nur werden die Argumente als Vektor übergeben Beispiel: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (void) { char *argumente[4]; argumente[0] = "ls"; argumente[1] = " l"; argumente[2] = getenv("home"); argumente[3] = NULL; } return vp ("/bin/ls", argumente);

() Beispiele V vp ähnlich zu lp() nur werden die Argumente als Vektor übergeben Beispiel: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main (void) { char *argumente[4]; argumente[0] = "ls"; argumente[1] = " l"; argumente[2] = getenv("home"); argumente[3] = NULL; } return vp ("/bin/ls", argumente);

Und alles gemeinsam... init fork() () Anwendung exit() wait()