Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Übung Betriebssysteme, Uni Innsbruck 1 Projekt1: Prozesse unter Unix Teil II Prozesse / Systemaufrufe Fehlerbehandlung.

Ähnliche Präsentationen


Präsentation zum Thema: "Übung Betriebssysteme, Uni Innsbruck 1 Projekt1: Prozesse unter Unix Teil II Prozesse / Systemaufrufe Fehlerbehandlung."—  Präsentation transkript:

1 Übung Betriebssysteme, Uni Innsbruck 1 Projekt1: Prozesse unter Unix Teil II Prozesse / Systemaufrufe Fehlerbehandlung

2 Übung Betriebssysteme, Uni Innsbruck 2 Übersicht u 2.0 Prozesse / Systemaufrufe unter Unix F 2.1 Was sind Prozesse ? F 2.2 Was sind Systemaufrufe ? F 2.3 Systemaufruf fork() F 2.4 Systemaufruf wait() F 2.5 Systemaufruf exec() F 2.6 Systemaufruf gets() F 2.7 Systemaufruf strtok() F 2.8 Systemaufruf getpid() F 2.9 Systemaufruf ipcrm / ipcs F 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)

3 Übung Betriebssysteme, Uni Innsbruck 3 Übersicht u 3.0 Fehlerbehandlung F 3.1 Was versteht man unter Fehlerbehandlung ? F 3.2 Fehlerbehandlung mit errno.h F 3.3 Fehlerbehandlung mit perror()

4 Übung Betriebssysteme, Uni Innsbruck 4 u 2.1 Was sind Prozesse ? u 2.2 Was sind Systemaufrufe ? u 2.3 Systemaufruf fork() u 2.4 Systemaufruf wait() u 2.5 Systemaufruf exec() u 2.6 Systemaufruf gets() u 2.7 Systemaufruf strtok() u 2.8 Systemaufruf getpid() u 2.9 Systemaufruf ipcrm / ipcs u 2.10 Message Queues (msgget, msgctl, msgsnd, msgrcv) Übersicht „ Prozesse und Systemaufrufe unter Unix“

5 Übung Betriebssysteme, Uni Innsbruck 5 u Definitionen F Ein Prozess ist eine zeitliche Abfolge einer Reihe von Aktionen - erzeugt durch Ausführung einer Folge von Instruktionen. F Ein Prozess ist ein in Ausführung befindliches Programm. u Prozesshierarchie F Ähnlich dem Dateisystem sind sämtliche Prozesse in einer baumartigen Hierarchie angeordnet. Alle Prozesse sind Nachfolger des Prozesses init (pid = 1), der während des Bootens als erster gestartet wird. F Durch die Kombination der Systemcalls „fork“ und „exec“ erzeugt init für jeden Terminaleingang einen Prozess getty (bzw. ttymon) der den interaktiven Zugang zum System ermöglicht. F Nach erfolgreichem Login wird die Shell gestartet. 2.1 Was sind Prozesse ?

6 Übung Betriebssysteme, Uni Innsbruck Was sind Prozesse ?

7 Übung Betriebssysteme, Uni Innsbruck 7 u Interface zwischen Prozess und Betriebssystem u Direkter Zugriff auf Funktionalität des Kernels u Unterschied zwischen Funktionsaufruf und SystemCall? F Funktion als Teil des Benutzerprogrammes F SystemCall exekutiert Kernel-Code u SystemCall schreibt die Parameter auf bestimmte Adresse und führt dann einen TRAP. BS übernimmt dann die Kontrolle. u Ein Systemaufruf erzeugt, zerstört oder benutzt verschiedene Ressourcen, die durch das Betriebssystem verwaltet werden. u Beispiele für Ressourcen: F Prozesse F Dateien F Speicher F Semaphore 2.2 Was sind Systemaufrufe ?

8 Übung Betriebssysteme, Uni Innsbruck 8 Systemaufruf

9 9 u fork() erzeugt einen neuen Prozess unter UNIX. u Nach der Ausführung des fork()-Aufrufs existieren zwei identische Prozesse, die vollständig unabhängig voneinander ablaufen. u verschiedene Prozess-IDs Syntax #include #include int fork(); u Rückgabewerte der Funktion fork(): F im Vater: die Prozeß-ID: (PID) des Sohn-Prozesses F im Sohn: der Wert 0 F im Fehlerfall: der Wert Systemaufruf fork()

10 Übung Betriebssysteme, Uni Innsbruck Systemaufruf fork()

11 Übung Betriebssysteme, Uni Innsbruck 11 u Mittels der Funktion wait() wartet ein Vater-Prozess auf das Ende eines Sohn-Prozesses. u Der Rückgabewert der Funktion ist die PID des Sohn-Prozesses, der gerade beendet wurde. u Ebenso wird in den Parameter „status“ durch das Betriebssystem der Exit-Code des Sohn-Prozesses, der durch den Befehl exit() gegeben ist, eingetragen. u Im Fehlerfall (wenn kein Sohn-Prozess vorhanden ist) gibt die Funktion den Rückgabewert -1 zurück und die Variable errno wird auf den entsprechenden Wert gesetzt. Syntax #include #include int wait(int *status); 2.4 Systemaufruf wait()

12 Übung Betriebssysteme, Uni Innsbruck 12 u Programmcode wird in den laufenden Prozess geladen. u Überladen eines Prozesses mit einem neuen Code u 5 verschiedene Routine mit kleinen Unterschieden: F execl, execle, execv, execlp und execvp. Syntax int execvp( const char *file, char *const argv[]) file Pointer auf die Datei, die ausgeführt werden soll argv Die Argumente, mit denen das Programm ausgeführt werden soll 2.5 Systemaufruf exec()

13 Übung Betriebssysteme, Uni Innsbruck 13 u einlesen einer Character-Sequenz von stin bis „\n“ oder EOF gelesen wurde u erzeugt einen String durch eliminieren von „\n“ und anhängen von „\0“ Beispiel#include int main(int argc, char **argv) { char buf[255]; printf ("type something:"); if ( gets(buf) != NULL ) printf ("you typed:%s\n",buf); } u Alternative: scanf 2.6 Systemaufruf gets()

14 Übung Betriebssysteme, Uni Innsbruck 14 u Eine Zeichenkette wird anhand eines Trennzeichens in mehrere Teile (Token) zerlegt. u Die zu zerlegende Zeichenkette muss nur beim ersten Aufruf angegeben werden, alle folgenden Aufrufe benötigen nur das Trennzeichen (siehe Beispiel). u Retourniert wird der Teilstring bis zum nächsten Trennzeichen Syntax #include #include char *strtok( char *str1, const char *delimiter ); 2.7 Systemaufruf strtok()

15 Übung Betriebssysteme, Uni Innsbruck 15 Beispiel char str[] = ”now # is the time for all # good men to come to the # aid"; char delims[] = "#"; char *result = NULL; result = strtok( str, delims ); while( result != NULL ) { printf( "result is \"%s\"\n", result ); result = strtok( NULL, delims ); } Resultat result is "now " result is " is the time for all " result is " good men to come to the " result is " aid" 2.7 Systemaufruf strtok()

16 Übung Betriebssysteme, Uni Innsbruck 16 u Liefert die eindeutige Prozess-ID (auch PID genannt) eines Prozesses. u Elternprozesses: getppid() Beispiel#include int main(int argc, char **argv) { char buf[255]; int pid=getpid(); printf ("my pid:%d\n",pid) } 2.8 Systemaufruf getpid()

17 Übung Betriebssysteme, Uni Innsbruck 17 u ipcs: zeigt Interprozesskommunikationsressourcen an (ipc status) F Kommando zum Auflisten der bereits vergebenen IPC-Ressourcen (Semaphoren, Message Queues und Shared Memory) F Enthält neben den Schlüsseln und der ID auch den Namen des Besitzers dieser Ressource u ipcrm: Ressourcen löschen (ipc remove) F falls ein Prozess seine eigenen Ressourcen nicht löscht gib die Ressourcen mit ipcrm freigib die Ressourcen mit ipcrm frei F Als Parameter dienen die ID der Ressource und der Typ. u ipcsfree löscht alle IPC-Ressourcen eines Benutzers F Pflicht: vor dem Ausloggen 2.9 Systemaufruf ipcrm / ipcs

18 Übung Betriebssysteme, Uni Innsbruck 18 ipcs IPC status from as of Tue Feb 4 20:39:43 CET 2003 T ID KEY MODE OWNER GROUP Message Queues: q 0 0x3c Rrw--w--w- root root q 1 0x3e rw-r--r-- root root Shared Memory: m xd29cf630 --rw-r----- oracle dba m x rw-rw-rw- daq cms Semaphores: s 1 0x41365ad3 --ra-ra-ra- root root s 2 0x ra-r--r-- root root s x89a5cac4 --ra-r----- oracle dba ipcrm -m 1300:löscht Shared Memory mit der ID 1300 ipcrm -M 0xd29cf630: löscht Shared Memory mit dem KEY 0xd29cf630 ipcrm -s : löscht Semaphor mit der ID ipcrm -S 0x89a5cac4:löscht Semaphor mit dem KEY 0x89a5cac4 ipcrm -q 0: löscht Message Queue mit der ID Systemaufruf ipcrm / ipcs

19 Übung Betriebssysteme, Uni Innsbruck 19 u Message Queues: Übertragung von Nachrichten zwischen Prozessen. u Nach Einrichten einer solchen Message Queue kann ein Prozess Nachrichten an eine bestimmte (oder mehrere) Message Queues schicken bzw. zu empfangen Message Queues (msgget, msgsnd, msgrcv, msgctl)

20 Übung Betriebssysteme, Uni Innsbruck Message Queues

21 Übung Betriebssysteme, Uni Innsbruck 21 u Neue Message Queues anlegen bzw. auf bestehende referenzieren mittels msgget() Syntax int msgget ( key_t key, int msgflg ) key Eindeutiger Schlüssel der Message Queue msgflg IPC_CREAT : falls noch keine Message Queue mit dem Schlüssel key existiert, wird eine neue angelegt, anderfalls auf die existierende MQ zugegriffen. IPC_EXCL : nur in Verbindung mit IPC_CREAT sinnvoll. Existiert bereits eine Message Queue mit dem Schlüssel key, wird -1 zurückgeliefert 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)

22 Übung Betriebssysteme, Uni Innsbruck 22 u msgsnd wird benutzt, um Nachrichten an andere Prozesse zu schicken Syntax int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg ) msqid Ist die Message Queue-ID msgp Ist ein Zeiger auf den Nachrichtenpuffer msgsz Gibt die Länge der Nachricht an (ohne die Länge des Nachrichtentyps) msgflg Kann entweder 0 oder IPC_NOWAIT sein (im Fall von IPC_NOWAIT wird nicht gewartet, falls es nicht möglich sein sollte, in den Puffer des Empfängerprozesses zu schreiben) 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)

23 Übung Betriebssysteme, Uni Innsbruck 23 u msgrcv wird benutzt, um Nachrichten von anderen Prozessen zu empfangen Syntax int msgrcv (int msqid, struct msgbuf *msgp, int msgsz, int msgtype, int msgflg ) msqid Ist die Message Queue-ID msgp Ist ein Zeiger auf den Nachrichtenpuffer msgsz Gibt die Länge der Nachricht an (ohne die Länge des Nachrichtentyps) msgtype Gibt an, welche Nachrichten gelesen werden sollen msgflg Kann entweder 0 oder IPC_NOWAIT sein (im Fall von IPC_NOWAIT wird nicht gewartet, falls sich keine Nachricht im Empfangspuffer befindet) 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)

24 Übung Betriebssysteme, Uni Innsbruck 24 u msgctl wird benutzt, um Message Queues zu verwalten Syntax int msgctl ( int msgqid, int cmd, struct msqid_ds *buf ) msqid Ist die Message Queue-ID cmd Gibt das Kommando an ( IPC_RMID, um die Queue zu löschen ) buf Wird als Kommando IPC_STAT angegeben (d.h. die Struktur einer Nachricht wird angefordert), wird die Struktur im Speicherbereich abgelebt, auf den buf zeigt 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)

25 Übung Betriebssysteme, Uni Innsbruck 25 Übersicht „ 3.0 Fehlerbehandlung“ u 3.1 Was versteht man unter Fehlerbehandlung ? u 3.2 Fehlerbehandlung mit errno.h u 3.3 Fehlerbehandlung mit perror()

26 Übung Betriebssysteme, Uni Innsbruck Was ist Fehlerbehandlung ? u Systemaufrufe unter Unix haben eine einheitliche Konvention zur Rückgabe von Werten: F Rückgabewerte jedes Systemaufrufs sind vom Typ int F Im Fehlerfall wird -1 geliefert F Wird ein Systemcall nicht wie gewünscht ausgeführt, wird die externe Systemvariable errno zusätzlich gesetzt (die verschiedenen Möglichkeiten von errno können in errno.h nachgelesen werden) F Die Funktion strerror wandelt den Fehlercode von errno in einen String um, der die Fehlerursache beschreibt (dieser sollte in jeder Fehlermeldung verwendet werden)

27 Übung Betriebssysteme, Uni Innsbruck Fehlerbehandlung mit errno.h u Deklariert die globale Variable errno, die von verschiedenen Funktionen im Fehlerfall gesetzt wird u Sowie alle Werte, die diese annehmen kann, als Konstante.

28 Übung Betriebssysteme, Uni Innsbruck Fehlerbehandlung mit perror() u perror() gibt eine Fehlermeldung auf stderror aus, die den letzten Fehler beschreibt, der von einem Systemcall oder einer Library- Routine erzeugt wurde. u Die Fehler-Nachricht bezieht sich auf die Variable errno des Systems, die von diesen Funktionen im Fehlerfall gesetzt wird. Syntax void perror( char *s ) F Wenn der Parameter s ein beliebiger String ist, wird dieser String gefolgt von einem Doppelpunkt und einem Blank und anschließend die Fehler-Nachricht ausgegeben. F Ist der Parameter s gleich NULL, wird nur die Fehler-Nachricht ausgegeben.


Herunterladen ppt "Übung Betriebssysteme, Uni Innsbruck 1 Projekt1: Prozesse unter Unix Teil II Prozesse / Systemaufrufe Fehlerbehandlung."

Ähnliche Präsentationen


Google-Anzeigen