Singale im elternprozess abfangen

N

Nano

Foren As
Hallo wiedermal,

besteht die möglichkeit das mein parent sigint für das kind abfängt und an es weiterleitet ? denn sinn der sache verstehe ich selbst nicht ;)

im kind läuft per exec ein prozess der den adressraum ersetzt daher können keine signale "vererbt" werden sondern nur blockiert, allerdings wenn ich es blockiere kann ich es vom parent ja nicht weiterleiten ? ein stelle an der ich es freigeben kann existiert nicht.

im programm ist es so gelöst das der user es nicht nicht per strg c an das kind schicken kann, allerdings fällt mir keine lösung ein das für ein kill childpid von einer anderen konsole aus abzufangen , ist das überhaupt möglich ?
 
Hi,

also der Sinn sollte doch wohl klar sein: du schreibst ein Kontrollprogramm, das zu beliebigen Programmen (sqlplus, Shell etc.) mit readline() eine History-Funktion implementiert. Und wenn ein User meint, er müsste dem kontrollierten Programm mit Ctrl-C einein Tritt verpassen, dann soll das natürlich nicht das Kontroll-Programm abschiessen, sondern möglichst transparent an den Child-Prozess durchgereicht werden.

Also: einfach mit sigaction() oder signal() eine SigHandler-Funktion für die wesentlichen Signale, die vom Benutzer kommen können (HUP, INTR, QUIT), aufsetzen, die diese Signale dann einfach mit kill() an den Slave-Prozess weiterleiten. Denke, bei einigen anderen Signaln macht das keinen Sinn: Signale, die dein Programm aufgrund von internen Fehlern einfängt (SEGFAULT etc.), sollte es natürlich selber abfangen ...

Gruss,
 
hi floyd ja das hab ich soweit auch die frage ist was mit kill childpid von einer andere shell aus ist die nichts mit dem prog zu tun hat und gezielt das kind abschießt, kann man das "blocken" ?

und der sinn bezog sich auf das abfangen wenn der user dem prozess einen tritt geben will kann er das ruhig machen, per sigchild wir der vater darüber informiert und es wird entsprechend gehandelt, ich denke das ist im sinne des anwenders
 
Da hab ich die Frage wohl nicht genau genug (oder weit genug) gelesen ... oder nicht ganz verstanden ...

Dass dein Child-Prozess eventuell von aussen abgeschossen werden kann, lässt sich m.E. nicht abfangen: das Verhalten nach dem exec() - also wie z.B. sqlplus auf die Signale reagiert - kannst du ja sowieso nicht mehr kontrollieren, und wenn du die Signale vor dem exec() schon auf SIG_IGN stellst, kannst du ja auch vom Parent-Prozess her nichts mehr schicken; ein Signal ist halt ein Signal, aber da kommt kein Absender mit, nach dem man dann noch filtern könnte ;-) ... Sehe darin allerdings kein wesentliches Problem: dass mir jemand mit den entsprechenden Privilegien (root) meine Session rausschmeisst, kann mir ja auch sonst jederzeit passieren ...

Nur aus Neugier: Du schreibst, im Programm sei das so gelöst, dass "der user es nicht nicht per strg c an das kind schicken kann"; wie hast du das implementiert? Per SIG_IGN vor dem Fork und Reaktivierung im Child danach, oder hast du den Sohnprozess nach dem fork() mit setsid() vom Master abgekoppelt und in eine eigene Process Group verschoben?
 
ich habe setsid() im kind genutzt so ist das programm abgekoppelt und der user kann da sigint im vater behandelt wird den sohn nicht unterbrechen, wobei ich keine processgruppe benutzt habe.

ich hatte mir schon gedacht das z.b ein kill von der shell aus nicht abfangbar ist wollte mit der frage nur sichergehen das ich die aufgabenstellung auch ausreichend implementiert habe.
 
Zurück
Oben