Frage zur bereitgestellten mini_sh.c

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Frage zur bereitgestellten mini_sh.c
Ich habe ein Verständnisproblem bei folgendem Codefragment in der execute_fg:

        while (wait(&status)==-1) {
                if (errno==EINTR) continue;
                perror("wait");
                return;
        }

Welchen Zweck hat die while-Schleife hier? wait liefert doch nur -1 zurück, wenn ein Signal beim Vaterprozess ankommt (in dem Fall wird auch errno auf EINTR gesetzt). Wenn das passiert und die Schleife durch continue; wiederholt wird, was soll dann als nächstes passieren?

Wäre schön, wenn mir das jemand erklären könnte.

Aqua


Sowie ich das in der Übung richtig verstanden hab, werden Sytemcalls wie wait bei einer Unterbrechung durch einen Interrupt nicht fortgesetzt, deswegen kommt es ja zu fehlermeldung per return -1 und errno=EINTR. Das heißt, dass der Systemcall seine Aufgabe nicht vollenden konnte, weil währenddessen ein Interrupt eintraf. Darum wird in diesem Fall die while Schleife, also wait nochmals aufgerufen.

Es gibt aber auch die Möglichkeit den Kernel dazu zu bringen, durch Interrupts unterbrochene Systemcalls erneut aufzurufen. Dies geschieht durch das sa_flag SA_RESTART.

siehe hierzu in der PDF SOS1U-8 auf Seite 11, und v.a. 17f.

Wiederaufsetzen von wait
Ja, wait wird beim Eintrreffen von einem Signal mit EINTR abgebrochen und durch
die while-Schleife wieder aufgesetzt. Das ist in der mini_sh auch sinnvoll, da ja nur
an dieser Stelle auf Zombie-Prozesse gewartet wird. In der job_sh ist das nicht mehr
umbedingt sinnvoll. Am besten man benutzt zum warten auf den Vordergrundprozess
nicht wait, sondern sigsuspend und macht das Aufraeumen aller Kinder im Signalhaendler
fuer SIGCHILD, also nur an einer Stelle. Ueber eine globale Variable kann, das
Hauptprogramm, dann ueber das terminieren des Vordergrundprocesses informiert
werden.

btw. wait kommt auch mit -1 zurueck wenn kein Kindprozess mehr existiert, darum ist
die Schleife nicht kritisch.