Interrupt-Handler für Kindprozesse

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.

Interrupt-Handler für Kindprozesse
Tag,

ich habe vergeblich versucht, das SIGINT-Signal für die Kinder zu ignorieren. Meine trash erstellt nach dem Starten einen SIGINT-handler für den ganzen Prozess (ein mal). NACH dem fork() habe ich in dem Block, der für den Kindprozess aufgerufen wird, ein globales flag is_child_process auf 1 gesetzt. Danach habe ich einen neuen SIGINT-Handler installiert (braucht man vielleicht nicht, aber egal). Im signal handler meiner trash kommt zwar ein SIGINT-signal an, wenn ich Strg-C drücke, aber nie für den Kindprozess, auch wenn er im Hintergrund läuft. Das flag ist immer 0, und das Kind terminiert :wand: . Was mache ich falsch? Danke im Voraus!


also vielleicht versteh ich dich falsch, aber ich hab da einfach das SIGINT mit SIGIGN ignoriert (also für den vater und damit auch für alle seine kinder). dann wird halt niemand mehr gekillt, aber das ist ja auch egal weil man ja eh das ganze dann so umschreiben soll dass der vater allen kindern ein SIGQUIT schickt und selber nur “Interrupt!” ausgibt. Diese ignorieren ist ja nur für die dokumentation nötig am ende bleibt das ja nicht so …


SIGIGN? Gute Idee, habe ich ganz übersehen. Werde ich mal ausprobieren… thanx


Nur kurze Zwischenfrage: macht ihr die Aufgaben wirklich schrittweise von oben bis unten durch? Mir ist das immer zu blöd, das Programm nachher ständig wieder umzuändern, nur weil sich die Aufgabe geändert hat. Dann bau ich gleich den Endstand zusammen.


schonmal daran gedacht ne komplexe loesung aus einfacheren teilschritten zusammenzubauen ??? Wenn du a weng nachdenkst wirst du sicherlich einsehen dass es fuer einige leute sehr viel sinn macht von klein und ueberschaubar nach gross und trotzdem ueberschaubar zu gehen :wand:

Mal was in eigener Sache, da ich gerade wieder das mit der “Interrupt !” meldung sehe : wie kann ich das machen ? ich hab da diese sigaction datenstruktur und die teilkomponente wo man eigentlich den pointer auf die funktion die einem das ausgibt und vielleicht dann in der endloesung das SIGQUIT an alle kinder schickt) aber mein compiler meckert … Vielleicht wird einer von euch schlau draus :gun:

freds_overrider.sa_handler = &sigannounce(SIGINT);

What da hell is goin’ on ??

NOTE : SIGINT ist global definierte Konstante. Da ich net wusste ob SIGINT schon global importiert wird hab ich das einfach mal mit nem #define SIGINT 2
gemacht.


hääääää, also bei mir steht da sowas wie

bla.sa_handler = handlefunction;

alles weitere läuft dann in der funktion ab.


ich dachte man muss da ne refernz auf die funktion uebergeben ? confused
ich schein das net richtig kapiert zu haben , propbier das aber gleich aus


Mal was anderes, immer wenn bei mir ein Vordergrundprozess terminiert hat (mit oder ohne Fehler) kommt:

trash> sleep 5
trash> Interrupt!
Exitstatus [sleep 5] = 0
trash>

…immer Interrupt! ! Ist das ein Fehler? Wie kriege ich das weg? :ohr:


Eine Funktion ist ein Pointer auf die Stelle im Speicher, wo der Maschienencode fuer die Funktion liegt, von daher gibt man da einfach den Namen der Funktion an, ohne & (mit muesste es auch gehen, weil der Compiler so schlau ist, aber der Parameter musst nicht du angeben, sonder der wird automatisch vom Betriebssystem gesetzt).

Da wird scheinbar Code ausgefuehrt, der nur (bzw genau) fuer deinen Intersignalhandler gelten soll.
Da hat man 2 Moeglichkeiten, entweder kann man fuer jedes Signal (das man speziell behandeln will) eine eigene Funktion, oder man hat eine Funktion, in der dann ein „mysignalhandler(int signum) {“ in der ein " switch (signumber)
{ SIGCHLD: … SIGINT: " steht.


Ja schon, aber ist das von den Aufgabenstellern so gedacht, dass bei jedem terminierten Vordergrundprozess ‚Interrupt!‘ ausgegeben wird, oder mache ich da etwas falsch? Ich habe ordnungsgemäß einen SIGINT handler für den Vaterprozess installiert, und die SIGINT Signale der Kinder lasse ich ignorieren (SIG_IGN), so wie es in der Aufgabenstellung steht. Aber es kommt stets ‚Interrupt!‘, das nervt auf die Dauer, macht das ganze Layout kaputt :motz: …


das soll natuerlich nicht kommen, waer auch sehr daemlich. vielleicht ein break im switch case vergessen?


Oh, ja stimmt, in C muss man bei switch ja immer break oder return verwenden - danke für den Tipp :smiley: