05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

80 2 Programmieren <strong>mit</strong> <strong>Unix</strong>-Prozessen<br />

20 int main( int argc, char *argv[] )<br />

21 {<br />

22 pid_t pid;<br />

23<br />

24 printf( "Prozeß %d: Starte fork()\n", getpid() );<br />

25<br />

26 switch( pid = fork() )<br />

27 {<br />

28 case -1: /* Fehler */<br />

29 printf( "Prozeß %d: Fehler in fork(): %s.\n",<br />

30 getpid(), strerror( errno ) );<br />

31 exit( EXIT_FAILURE );<br />

32 break;<br />

33 case 0: /* Kindprozeß */<br />

34 printf( "Prozeß %d: Ich bin der neue Kindprozeß\n",<br />

35 getpid() );<br />

36 break;<br />

37 default: /* Elternprozeß */<br />

38 printf( "Prozeß %d: Kindprozeß läuft: PID = %d.\n",<br />

39 getpid(), pid );<br />

40 break;<br />

41 }<br />

42<br />

43 sleep( 1 ); /* kurze Kunstpause */<br />

44<br />

45 show_ids();<br />

46 exit( EXIT_SUCCESS );<br />

47 }<br />

7–18<br />

26–41<br />

43–46<br />

Nach den nötigen Includes packen wir zunächst die ID-Abfragen aus Beispiel<br />

2.18 in eine eigene Funktion show_ids(), die wir später in beiden Prozessen<br />

aufrufen werden.<br />

Im Hauptprogramm wird nach einer Kontrollausgabe die Funktion fork()<br />

aufgerufen. Mit Hilfe der switch-Anweisung können wir auf übersichtliche Art<br />

<strong>und</strong> Weise zwischen den verschiedenen Rückgabewerten der fork()-Funktion<br />

unterscheiden. Im Fehlerfall wird von fork() kein neuer Prozeß erzeugt. Unser<br />

Prozeß beendet sich in diesem Falls umgehend <strong>mit</strong> einer Fehlermeldung.<br />

Andernfalls existieren nach der Rückkehr aus der fork()-Funktion zwei Prozesse:<br />

Der ursprüngliche Prozeß, den wir als Elternprozeß bezeichnen <strong>und</strong> eine<br />

(nahezu) identische Kopie davon, der sogenannte Kindprozeß. Beide Prozesse<br />

setzen ihren Programmfluß un<strong>mit</strong>telbar nach der fork()-Funktion fort. Der<br />

Rückgabewert von fork() gibt im jeweiligen Prozeß auskunft darüber, ob es<br />

sich um den Eltern- oder den Kindprozeß handelt.<br />

Nach einer kurzen Kunstpause, deren Sinn sich bei den Testläufen erschließen<br />

wird, rufen beide Prozesse die Funktion show_ids() auf <strong>und</strong> beenden dann<br />

ihre Arbeit.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!