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

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

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

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

Übung Betriebssysteme, Uni Innsbruck

1

Projekt1: Prozesse unter UnixProjekt1: Prozesse unter Unix

Teil IITeil II

Prozesse / SystemaufrufeProzesse / Systemaufrufe

FehlerbehandlungFehlerbehandlung

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

2

ÜbersichtÜbersicht

2.0 Prozesse / Systemaufrufe unter Unix2.0 Prozesse / Systemaufrufe unter Unix 2.1 Was sind Prozesse ?2.1 Was sind Prozesse ? 2.2 Was sind Systemaufrufe ?2.2 Was sind Systemaufrufe ? 2.3 Systemaufruf fork()2.3 Systemaufruf fork() 2.4 Systemaufruf wait()2.4 Systemaufruf wait() 2.5 Systemaufruf exec()2.5 Systemaufruf exec() 2.6 Systemaufruf gets()2.6 Systemaufruf gets() 2.7 Systemaufruf strtok()2.7 Systemaufruf strtok() 2.8 Systemaufruf getpid()2.8 Systemaufruf getpid() 2.9 Systemaufruf ipcrm / ipcs2.9 Systemaufruf ipcrm / ipcs 2.10 Message Queues (msgget, msgsnd, msgrcv, 2.10 Message Queues (msgget, msgsnd, msgrcv,

msgctl)msgctl)

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

3

ÜbersichtÜbersicht

3.0 Fehlerbehandlung3.0 Fehlerbehandlung 3.1 Was versteht man unter Fehlerbehandlung ?3.1 Was versteht man unter Fehlerbehandlung ? 3.2 Fehlerbehandlung mit errno.h3.2 Fehlerbehandlung mit errno.h 3.3 Fehlerbehandlung mit perror()3.3 Fehlerbehandlung mit perror()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

4

2.1 Was sind Prozesse ?2.1 Was sind Prozesse ? 2.2 Was sind Systemaufrufe ?2.2 Was sind Systemaufrufe ? 2.3 Systemaufruf fork()2.3 Systemaufruf fork() 2.4 Systemaufruf wait()2.4 Systemaufruf wait() 2.5 Systemaufruf exec()2.5 Systemaufruf exec() 2.6 Systemaufruf gets()2.6 Systemaufruf gets() 2.7 Systemaufruf strtok()2.7 Systemaufruf strtok() 2.8 Systemaufruf getpid()2.8 Systemaufruf getpid() 2.9 Systemaufruf ipcrm / ipcs2.9 Systemaufruf ipcrm / ipcs 2.10 Message Queues (msgget, msgctl, msgsnd, msgrcv)2.10 Message Queues (msgget, msgctl, msgsnd, msgrcv)

Übersicht „Übersicht „Prozesse undProzesse undSystemaufrufe unter Unix“Systemaufrufe unter Unix“

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

5

DefinitionenDefinitionen Ein Prozess ist eine zeitliche Abfolge einer Reihe von Aktionen - Ein Prozess ist eine zeitliche Abfolge einer Reihe von Aktionen -

erzeugt durch Ausführung einer Folge von Instruktionen. erzeugt durch Ausführung einer Folge von Instruktionen. Ein Prozess ist ein in Ausführung befindliches Programm. Ein Prozess ist ein in Ausführung befindliches Programm.

ProzesshierarchieProzesshierarchie Ähnlich dem Dateisystem sind sämtliche Prozesse in einer Ähnlich dem Dateisystem sind sämtliche Prozesse in einer

baumartigen Hierarchie angeordnet. baumartigen Hierarchie angeordnet. Alle Prozesse sind Nachfolger des Prozesses init (pid = 1), der Alle Prozesse sind Nachfolger des Prozesses init (pid = 1), der während des Bootens als erster gestartet wird. während des Bootens als erster gestartet wird.

Durch die Kombination der Systemcalls „fork“ und „exec“ erzeugt Durch die Kombination der Systemcalls „fork“ und „exec“ erzeugt init für jeden Terminaleingang einen Prozess getty (bzw. ttymon) init für jeden Terminaleingang einen Prozess getty (bzw. ttymon) der den interaktiven Zugang zum System ermöglicht.der den interaktiven Zugang zum System ermöglicht.

Nach erfolgreichem Login wird die Shell gestartet. Nach erfolgreichem Login wird die Shell gestartet.

2.1 Was sind Prozesse ?2.1 Was sind Prozesse ?

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

6

2.1 Was sind Prozesse ?2.1 Was sind Prozesse ?

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

7

Interface zwischen Prozess und BetriebssystemInterface zwischen Prozess und Betriebssystem Direkter Zugriff auf Funktionalität des Kernels Direkter Zugriff auf Funktionalität des Kernels Unterschied zwischen Funktionsaufruf und SystemCall?Unterschied zwischen Funktionsaufruf und SystemCall?

Funktion als Teil des BenutzerprogrammesFunktion als Teil des Benutzerprogrammes SystemCall exekutiert Kernel-CodeSystemCall exekutiert Kernel-Code

SystemCall schreibt die Parameter auf bestimmte Adresse und führt SystemCall schreibt die Parameter auf bestimmte Adresse und führt dann einen TRAP. BS übernimmt dann die Kontrolle. dann einen TRAP. BS übernimmt dann die Kontrolle.

Ein Systemaufruf erzeugt, zerstört oder benutzt verschiedene Ein Systemaufruf erzeugt, zerstört oder benutzt verschiedene Ressourcen, die durch das Betriebssystem verwaltet werden. Ressourcen, die durch das Betriebssystem verwaltet werden.

Beispiele für Ressourcen:Beispiele für Ressourcen: Prozesse Prozesse Dateien Dateien SpeicherSpeicher SemaphoreSemaphore

2.2 Was sind Systemaufrufe ?2.2 Was sind Systemaufrufe ?

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

8

SystemaufrufSystemaufruf

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

9

fork() erzeugt einen neuen Prozess unter UNIX.fork() erzeugt einen neuen Prozess unter UNIX. Nach der Ausführung des fork()-Aufrufs existieren zwei identische Nach der Ausführung des fork()-Aufrufs existieren zwei identische

Prozesse, die vollständig unabhängig voneinander ablaufen.Prozesse, die vollständig unabhängig voneinander ablaufen. verschiedene Prozess-IDsverschiedene Prozess-IDs

SyntaxSyntax#include <unistd.h> #include <unistd.h> int fork();int fork();

Rückgabewerte der Funktion fork():Rückgabewerte der Funktion fork():

im Vater: die Prozeß-ID: (PID) des Sohn-Prozesses im Vater: die Prozeß-ID: (PID) des Sohn-Prozesses im Sohn: der Wert 0 im Sohn: der Wert 0 im Fehlerfall: der Wert -1 im Fehlerfall: der Wert -1

2.3 Systemaufruf fork()2.3 Systemaufruf fork()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

10

2.3 Systemaufruf fork()2.3 Systemaufruf fork()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

11

Mittels der Funktion wait() wartet ein Vater-Prozess auf das Ende Mittels der Funktion wait() wartet ein Vater-Prozess auf das Ende eines Sohn-Prozesses. eines Sohn-Prozesses.

Der Rückgabewert der Funktion ist die PID des Sohn-Prozesses, der Der Rückgabewert der Funktion ist die PID des Sohn-Prozesses, der gerade beendet wurde. gerade beendet wurde.

Ebenso wird in den Parameter „status“ durch das Betriebssystem der Ebenso wird in den Parameter „status“ durch das Betriebssystem der Exit-Code des Sohn-Prozesses, der durch den Befehl exit() gegeben Exit-Code des Sohn-Prozesses, der durch den Befehl exit() gegeben ist, eingetragen. ist, eingetragen.

Im Fehlerfall (wenn kein Sohn-Prozess vorhanden ist) gibt die Funktion Im Fehlerfall (wenn kein Sohn-Prozess vorhanden ist) gibt die Funktion den Rückgabewert -1 zurück und die Variable den Rückgabewert -1 zurück und die Variable errnoerrno wird auf den wird auf den entsprechenden Wert gesetzt. entsprechenden Wert gesetzt.

SyntaxSyntax#include <sys/wait.h> #include <sys/wait.h> int wait(int *status);int wait(int *status);

2.4 Systemaufruf wait()2.4 Systemaufruf wait()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

12

Programmcode wird in den laufenden Prozess geladen.Programmcode wird in den laufenden Prozess geladen.

Überladen eines Prozesses mit einem neuen CodeÜberladen eines Prozesses mit einem neuen Code

5 verschiedene Routine mit kleinen Unterschieden:5 verschiedene Routine mit kleinen Unterschieden: execl, execle, execv, execlp und execvp. execl, execle, execv, execlp und execvp.

SyntaxSyntaxint execvp( const char *file, char *const argv[])int execvp( const char *file, char *const argv[])

filefilePointer auf die Datei, die ausgeführt werden sollPointer auf die Datei, die ausgeführt werden soll

argvargvDie Argumente, mit denen das Programm ausgeführt werden sollDie Argumente, mit denen das Programm ausgeführt werden soll

2.5 Systemaufruf exec()2.5 Systemaufruf exec()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

13

einlesen einer Character-Sequenz von stin bis „\n“ oder einlesen einer Character-Sequenz von stin bis „\n“ oder EOF gelesen wurde EOF gelesen wurde

erzeugt einen String durch eliminieren von „\n“ und erzeugt einen String durch eliminieren von „\n“ und anhängen von „\0“ anhängen von „\0“

Beispiel Beispiel #include<stdio.h> #include<stdio.h> int main(int argc, char **argv) int main(int argc, char **argv) { {

char buf[255]; char buf[255]; printf ("type something:"); printf ("type something:"); if ( gets(buf) != NULL )if ( gets(buf) != NULL )

printf ("you typed:%s\n",buf); printf ("you typed:%s\n",buf); }}

Alternative: scanfAlternative: scanf

2.6 Systemaufruf gets()2.6 Systemaufruf gets()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

14

Eine Zeichenkette wird anhand eines Trennzeichens in mehrere Teile Eine Zeichenkette wird anhand eines Trennzeichens in mehrere Teile (Token) zerlegt.(Token) zerlegt.

Die zu zerlegende Zeichenkette muss nur beim ersten Aufruf Die zu zerlegende Zeichenkette muss nur beim ersten Aufruf angegeben werden, alle folgenden Aufrufe benötigen nur das angegeben werden, alle folgenden Aufrufe benötigen nur das Trennzeichen (siehe Beispiel).Trennzeichen (siehe Beispiel).

Retourniert wird der Teilstring bis zum nächsten TrennzeichenRetourniert wird der Teilstring bis zum nächsten Trennzeichen

SyntaxSyntax#include <string.h> #include <string.h> char *strtok( char *str1, const char *delimiter ); char *strtok( char *str1, const char *delimiter );

2.7 Systemaufruf strtok()2.7 Systemaufruf strtok()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

15

BeispielBeispielchar str[] = ”now # is the time for all # good men to come to the # aid"; char str[] = ”now # is the time for all # good men to come to the # aid"; char delims[] = "#"; char delims[] = "#"; char *result = NULL; char *result = NULL;

result = strtok( str, delims ); result = strtok( str, delims ); while( result != NULL ) { while( result != NULL ) {

printf( "result is \"%s\"\n", result ); printf( "result is \"%s\"\n", result ); result = strtok( NULL, delims ); } result = strtok( NULL, delims ); }

ResultatResultatresult is "now " result is "now " result is " is the time for all " result is " is the time for all " result is " good men to come to the " result is " good men to come to the " result is " aid" result is " aid"

2.7 Systemaufruf strtok()2.7 Systemaufruf strtok()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

16

Liefert die eindeutige Prozess-ID (auch PID genannt) eines Liefert die eindeutige Prozess-ID (auch PID genannt) eines Prozesses. Prozesses.

Elternprozesses: getppid() Elternprozesses: getppid()

Beispiel Beispiel #include<stdio.h> #include<stdio.h> int main(int argc, char **argv) int main(int argc, char **argv) { {

char buf[255]; char buf[255]; int pid=getpid(); int pid=getpid(); printf ("my pid:%d\n",pid)printf ("my pid:%d\n",pid)

}}

2.8 Systemaufruf getpid()2.8 Systemaufruf getpid()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

17

ipcs:ipcs: zeigt Interprozesskommunikationsressourcen an (ipc status) zeigt Interprozesskommunikationsressourcen an (ipc status) Kommando zum Auflisten der bereits vergebenen IPC-Ressourcen Kommando zum Auflisten der bereits vergebenen IPC-Ressourcen

(Semaphoren, Message Queues und Shared Memory)(Semaphoren, Message Queues und Shared Memory) Enthält neben den Schlüsseln und der ID auch den Namen des Enthält neben den Schlüsseln und der ID auch den Namen des

Besitzers dieser RessourceBesitzers dieser Ressource

ipcrm:ipcrm: Ressourcen löschen (ipc remove) Ressourcen löschen (ipc remove) falls ein Prozess seine eigenen Ressourcen nicht löschtfalls ein Prozess seine eigenen Ressourcen nicht löscht

• gib die Ressourcen mit ipcrm freigib die Ressourcen mit ipcrm frei Als Parameter dienen die ID der Ressource und der Typ.Als Parameter dienen die ID der Ressource und der Typ.

ipcsfreeipcsfree löscht alle IPC-Ressourcen eines Benutzers löscht alle IPC-Ressourcen eines Benutzers Pflicht: vor dem AusloggenPflicht: vor dem Ausloggen

2.9 Systemaufruf ipcrm / ipcs2.9 Systemaufruf ipcrm / ipcs

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

18

ipcsipcsIPC status from <running system> as of Tue Feb 4 20:39:43 CET 2003IPC status from <running system> as of Tue Feb 4 20:39:43 CET 2003

T T ID ID KEY KEY MODE MODE OWNER OWNER GROUPGROUPMessage Queues: Message Queues: q q 0 0 0x3c340863 0x3c340863 -Rrw--w--w- -Rrw--w--w- root root root root q q 1 1 0x3e340863 0x3e340863 --rw-r--r-- --rw-r--r-- root root rootrootShared Memory:Shared Memory:m m 1300 1300 0xd29cf630 0xd29cf630 --rw-r----- --rw-r----- oracle oracle dbadbam m 1203 1203 0x73746174 0x73746174 --rw-rw-rw- --rw-rw-rw- daq daq cmscmsSemaphores:Semaphores:s s 1 1 0x41365ad3 0x41365ad3 --ra-ra-ra- --ra-ra-ra- root root rootroots s 2 2 0x01090522 0x01090522 --ra-r--r-- --ra-r--r-- root root root root s s 17694721769472 0x89a5cac4 0x89a5cac4 --ra-r----- --ra-r----- oracle oracle dbadba

ipcrm -m 1300:ipcrm -m 1300: löscht Shared Memory mit der löscht Shared Memory mit der ID 1300ID 1300ipcrm -M 0xd29cf630: ipcrm -M 0xd29cf630: löscht Shared Memory mit demlöscht Shared Memory mit dem KEY 0xd29cf630 KEY 0xd29cf630 ipcrm -s 1769472: ipcrm -s 1769472: löscht Semaphor mit der löscht Semaphor mit der ID 1769472ID 1769472 ipcrm -S 0x89a5cac4:ipcrm -S 0x89a5cac4: löscht Semaphor mit dem löscht Semaphor mit dem KEY 0x89a5cac4KEY 0x89a5cac4 ipcrm -q 0: ipcrm -q 0: löscht Message Queue mit der löscht Message Queue mit der ID 0ID 0

2.9 Systemaufruf ipcrm / ipcs2.9 Systemaufruf ipcrm / ipcs

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

19

Message Queues: Übertragung von Nachrichten zwischen Message Queues: Übertragung von Nachrichten zwischen Prozessen.Prozessen.

Nach Einrichten einer solchen Message Queue kann ein Nach Einrichten einer solchen Message Queue kann ein Prozess Nachrichten an eine bestimmte (oder mehrere) Prozess Nachrichten an eine bestimmte (oder mehrere) Message Queues schicken bzw. zu empfangen.Message Queues schicken bzw. zu empfangen.

2.10 Message Queues 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)(msgget, msgsnd, msgrcv, msgctl)

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

20

2.10 Message Queues 2.10 Message Queues

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

21

Neue Message Queues anlegen bzw. auf bestehende referenzieren Neue Message Queues anlegen bzw. auf bestehende referenzieren mittels mittels msgget()msgget()

SyntaxSyntaxint msgget ( key_t key, int msgflg )int msgget ( key_t key, int msgflg )

keykeyEindeutiger Schlüssel der Message QueueEindeutiger Schlüssel der Message Queue

msgflgmsgflgIPC_CREAT : IPC_CREAT : falls noch keine Message Queue mit dem Schlüssel falls noch keine Message Queue mit dem Schlüssel key existiert, wird eine neue angelegt, anderfalls auf key existiert, wird eine neue angelegt, anderfalls auf die die existierende MQ zugegriffen.existierende MQ zugegriffen.

IPC_EXCL : IPC_EXCL : nur in Verbindung mit IPC_CREAT sinnvoll. Existiert nur in Verbindung mit IPC_CREAT sinnvoll. Existiert bereits eine Message Queue mit dem Schlüssel bereits eine Message Queue mit dem Schlüssel key, wird -1 key, wird -1 zurückgeliefertzurückgeliefert

2.10 Message Queues 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)(msgget, msgsnd, msgrcv, msgctl)

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

22

msgsnd wird benutzt, um Nachrichten an andere Prozesse zu schickenmsgsnd wird benutzt, um Nachrichten an andere Prozesse zu schicken

SyntaxSyntaxint msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg )int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg )

msqidmsqid Ist die Message Queue-IDIst die Message Queue-ID

msgp msgp Ist ein Zeiger auf den NachrichtenpufferIst ein Zeiger auf den Nachrichtenpuffer

msgsz msgsz Gibt die Länge der Nachricht an (ohne die Länge des Nachrichtentyps)Gibt die Länge der Nachricht an (ohne die Länge des Nachrichtentyps)

msgflg msgflg Kann entweder 0 oder IPC_NOWAIT sein (im Fall von IPC_NOWAIT 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 wird nicht gewartet, falls es nicht möglich sein sollte, in den Puffer des Empfängerprozesses zu schreiben)Empfängerprozesses zu schreiben)

2.10 Message Queues 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)(msgget, msgsnd, msgrcv, msgctl)

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

23

msgrcv wird benutzt, um Nachrichten von anderen Prozessen zu msgrcv wird benutzt, um Nachrichten von anderen Prozessen zu empfangenempfangen

SyntaxSyntaxint msgrcv (int msqid, struct msgbuf *msgp, int msgsz, int msgtype, int int msgrcv (int msqid, struct msgbuf *msgp, int msgsz, int msgtype, int

msgflg ) msgflg )

msqidmsqid Ist die Message Queue-IDIst die Message Queue-ID

msgp msgp Ist ein Zeiger auf den NachrichtenpufferIst ein Zeiger auf den Nachrichtenpuffer

msgsz msgsz Gibt die Länge der Nachricht an (ohne die Länge des Nachrichtentyps)Gibt die Länge der Nachricht an (ohne die Länge des Nachrichtentyps)

msgtypemsgtypeGibt an, welche Nachrichten gelesen werden sollenGibt an, welche Nachrichten gelesen werden sollen

msgflg msgflg Kann entweder 0 oder IPC_NOWAIT sein (im Fall von IPC_NOWAIT wird Kann entweder 0 oder IPC_NOWAIT sein (im Fall von IPC_NOWAIT wird nicht gewartet, falls sich keine Nachricht im Empfangspuffer befindet)nicht gewartet, falls sich keine Nachricht im Empfangspuffer befindet)

2.10 Message Queues 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)(msgget, msgsnd, msgrcv, msgctl)

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

24

msgctl wird benutzt, um Message Queues zu verwaltenmsgctl wird benutzt, um Message Queues zu verwalten

SyntaxSyntaxint msgctl ( int msgqid, int cmd, struct msqid_ds *buf )int msgctl ( int msgqid, int cmd, struct msqid_ds *buf )

msqidmsqid Ist die Message Queue-IDIst die Message Queue-ID

cmdcmdGibt das Kommando an ( IPC_RMID, Gibt das Kommando an ( IPC_RMID, um die Queue zu löschenum die Queue zu löschen ) )

buf buf Wird als Kommando IPC_STAT angegeben (d.h. die Struktur einer Wird als Kommando IPC_STAT angegeben (d.h. die Struktur einer Nachricht wird angefordert), wird die Struktur im Speicherbereich Nachricht wird angefordert), wird die Struktur im Speicherbereich abgelebt, auf den buf zeigtabgelebt, auf den buf zeigt

2.10 Message Queues 2.10 Message Queues (msgget, msgsnd, msgrcv, msgctl)(msgget, msgsnd, msgrcv, msgctl)

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

25

Übersicht „Übersicht „3.0 Fehlerbehandlung“3.0 Fehlerbehandlung“

3.1 Was versteht man unter Fehlerbehandlung ?3.1 Was versteht man unter Fehlerbehandlung ?

3.2 Fehlerbehandlung mit errno.h3.2 Fehlerbehandlung mit errno.h

3.3 Fehlerbehandlung mit perror()3.3 Fehlerbehandlung mit perror()

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

26

3.1 Was ist 3.1 Was ist Fehlerbehandlung ?Fehlerbehandlung ? Systemaufrufe unter Unix haben eine einheitliche Konvention zur Systemaufrufe unter Unix haben eine einheitliche Konvention zur

Rückgabe von Werten: Rückgabe von Werten:

Rückgabewerte jedes Systemaufrufs sind vom Typ Rückgabewerte jedes Systemaufrufs sind vom Typ intint

Im Fehlerfall wird -1 geliefertIm Fehlerfall wird -1 geliefert

Wird ein Systemcall nicht wie gewünscht ausgeführt, wird die Wird ein Systemcall nicht wie gewünscht ausgeführt, wird die externe Systemvariable externe Systemvariable errnoerrno zusätzlich gesetzt (die zusätzlich gesetzt (die verschiedenen Möglichkeiten von errno können in errno.h verschiedenen Möglichkeiten von errno können in errno.h nachgelesen werden)nachgelesen werden)

Die Funktion Die Funktion strerrorstrerror wandelt den Fehlercode von errno in einen wandelt den Fehlercode von errno in einen String um, der die Fehlerursache beschreibt (dieser sollte in jeder String um, der die Fehlerursache beschreibt (dieser sollte in jeder Fehlermeldung verwendet werden)Fehlermeldung verwendet werden)

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

27

3.2 Fehlerbehandlung mit errno.h3.2 Fehlerbehandlung mit errno.h Deklariert die globale Variable errno, die von verschiedenen Deklariert die globale Variable errno, die von verschiedenen

Funktionen im Fehlerfall gesetzt wirdFunktionen im Fehlerfall gesetzt wird

Sowie alle Werte, die diese annehmen kann, als Konstante.Sowie alle Werte, die diese annehmen kann, als Konstante.

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

Übu

ng B

etrie

bssy

stem

e, U

ni In

nsbr

uck

28

3.3 Fehlerbehandlung mit perror()3.3 Fehlerbehandlung mit perror()

perror()perror() gibt eine Fehlermeldung auf stderror aus, die den letzten gibt eine Fehlermeldung auf stderror aus, die den letzten Fehler beschreibt, der von einem Systemcall oder einer Library-Fehler beschreibt, der von einem Systemcall oder einer Library-Routine erzeugt wurde.Routine erzeugt wurde.

Die Fehler-Nachricht bezieht sich auf die Variable Die Fehler-Nachricht bezieht sich auf die Variable errnoerrno des Systems, des Systems, die von diesen Funktionen im Fehlerfall gesetzt wird.die von diesen Funktionen im Fehlerfall gesetzt wird.

Syntax Syntax void perror( char *s )void perror( char *s )

Wenn der Parameter s ein beliebiger String ist, wird dieser String Wenn der Parameter s ein beliebiger String ist, wird dieser String gefolgt von einem Doppelpunkt und einem Blank und anschließend gefolgt von einem Doppelpunkt und einem Blank und anschließend die Fehler-Nachricht ausgegeben. die Fehler-Nachricht ausgegeben.

Ist der Parameter s gleich NULL, wird nur die Fehler-Nachricht Ist der Parameter s gleich NULL, wird nur die Fehler-Nachricht ausgegeben. ausgegeben.