/**************************************************************/ /* */ /* UNIX 1 / WS 92/93 Gruppe ux803 */ /* 6. Uebung - theoretische Aufgaben */ /* */ /* Vorname Name Matrikelnr. */ /* --------- ------- ------------- */ /* Dietmar Dierks 125761 */ /* Roman Czyborra 127221 */ /* Torsten Buller 117894 */ /* Gerasimos Paliatsaras 140956 */ /* */ /**************************************************************/ Aufgabe 1 ========= Folgendermassen wird eine zyklische Kommunikation A->B->C->A eingerichtet. Mit unbenannten Pipes: { int AB[2], BC[2], CA[2]; pipe (AB); pipe (BC); pipe (CA); if (fork()) { close (AB[0]); close (BC[0]); close (BC[1]); close (CA[1]); ... /* Prozess A */ } else if (fork ()) { close (BC[0]); close (CA[0]); close (CA[1]); close (AB[1]); ... /* Prozess B */ } else { close (CA[0]); close (AB[0]); close (AB[1]); close (BC[1]); ... /* Prozess C */ } } Oder mit benannten Pipes: { mkfifo ("AB"); open ("AB", O_WRONLY); while (open ("CA", O_RDONLY) == -1) sleep (1); ... /* Prozess A (B und C analog) */ } Aufgabe 2 ========= Ein Signalhandler ist eine Signalbehandlungsroutine, die beim Auftreten eines bestimmten Signalereignisses angesprungen werden soll, aehnlich wie ein Interrupthandler. Installiert wird dieser Verweis am einfachsten mit der Bibliotheksroutine signal (, <&Behandlungsroutine>) Fork vererbt installierte Handler, Exec vernichtet sie. Aufgabe 3 ========= Wie koennte ein Prozess verhindern, dass Ctrl-C ihn abbricht? 1. Mit signal (SIGINT, SIG_IGN) 2. Mit einem eigenen Handler fuer SIGINT 3. Indem er der Taste Ctrl-C die Bedeutung entzieht: { struct termio setting; ioctl (stdin, TCGETS, &setting); setting.c_cc[VINTR]= 0; ioctl (stdin, TCSETS, &setting); }