rush

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.

rush
Hi,
ein paar Fragen tun sich bei mir zur rush auf.

Zunächst lese ich in den älteren Folien, dass man um das sigsuspend eine Schleife machen soll. Ist dem so?
Aber was ist dann die Abbruchbedingung? Und wieso in einer Schleife? Warum reicht es nicht, auf das beenden, des Vordergrundprozesses und damit das SIGCHLD zu warten?
Und was bringt dort die Schleife, wenn ich sowieso passiv warte?

Bei der e) verstehe ich auch noch nicht, wie denn der SigHandler für das Stop Signal aussehen soll. Soll der dann die Bedingung für die sigsuspend schleife setzen?
Wie stoppe ich den Prozess in der Behandlung? Bei der c) habe ich als Sighandler halt die Default Implementierung angegeben um den Prozess zu stoppen.

Danke im vorraus


Bist du dir sicher, dass da nur ein [m]SIGCHLD[/m] kommen kann?

Ja, der Signal-Handler muss das machen; siehe auch [m]man 3 waitpid[/m] und dort die [m]options[/m].

Was meinst du damit? Der Prozess wird durch das Ctrl-Z gestoppt - du bekommst nur die Signalisierung, dass er jetzt gestoppt ist (wenn du die richtigen Flags verwendest).


Danke für die Hilfe rudis.

Ich habe meine maske mit setfillset komplett gefüllt und dann SIGCHLD daraus entfernt.
Also dürfte sigsuspend doch nur da rauskommen.
Aber das ist wohl nicht der richtige Ansatz? Hat mir halt der SP-Tutor gestern so empfohlen.


Das Problem dabei ist, dass du dann der Shell keine anderen Signale mehr zustellen kannst, während sie im [m]sigsupsend(2)[/m] wartet. Die einfachste Lösung ist einfach [m]oldset[/m] vom [m]sigpromask(2)[/m]-Aufruf zu verwenden. Dann sparst du dir auch das manuelle setzen. [m]oldset[/m] ist auch beim Deblockieren von Signalen praktisch, einfach mit [m]SIG_SETMASK[/m] aufrufen.


Müssen wir beim setzen des SignalHandlers sicherstellen dass SIGCHLD nicht geblockt ist?JA
Weil sonst kann es ja sein, dass wir ewig warten wenn wir sigsuspend mit der alten Maske aufrufen (in der SIGCHLD zufällig geblockt ist), oder täusch ich mich da? JA
Und ist die Maske die man mit sigaction setzt überhaupt die gleiche, wie die, die man mit sigprocmask verändert? Nein die ist nur für den SignalHandler
Ich steh grad ein bisschen auf dem Schlauch.
Nevermind. Mir ist schlagartig alles wieder eingefallen :smiley:
Gruß

Darky


Bei der maske die du sigsuspend() mitgibst solltest du schon sichergehen, dass SIGCHLD nicht geblockt ist, jop.