Not logged in. · Lost password · Register

MatthiasM
Avatar
Member since Nov 2003
459 posts
Subject: 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!
Der Computer ist ein mechanischer Hohlkopf.
snehls
Superfreund aka Der Schwede
Avatar
Member since Oct 2002
750 posts
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 .....
"I will speculate that today’s single-threaded applications as actually used in the field could actually see a performance boost for most users by going to a dual-core chip, not because the extra core is actually doing anything useful, but because it is running the adware and spyware that infest many users’ systems and are otherwise slowing down the single CPU that user has today."
MatthiasM
Avatar
Member since Nov 2003
459 posts
SIGIGN? Gute Idee, habe ich ganz übersehen. Werde ich mal ausprobieren... thanx
Der Computer ist ein mechanischer Hohlkopf.
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
In reply to post #2
Quote by snehls:
am ende bleibt das ja nicht so .....
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.
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
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.
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
snehls
Superfreund aka Der Schwede
Avatar
Member since Oct 2002
750 posts
Quote by fredator:
freds_overrider.sa_handler = &sigannounce(SIGINT);

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

bla.sa_handler = handlefunction;

alles weitere läuft dann in der funktion ab.
"I will speculate that today’s single-threaded applications as actually used in the field could actually see a performance boost for most users by going to a dual-core chip, not because the extra core is actually doing anything useful, but because it is running the adware and spyware that infest many users’ systems and are otherwise slowing down the single CPU that user has today."
This post was edited on 2004-01-05, 23:59 by snehls.
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
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
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
MatthiasM
Avatar
Member since Nov 2003
459 posts
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:
Der Computer ist ein mechanischer Hohlkopf.
frahi
Avatar
Member since Nov 2002
777 posts
In reply to post #7
Quote by fredator:
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

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).

Quote by MatthiasM:
...immer Interrupt! ! Ist das ein Fehler? Wie kriege ich das weg?

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.
MatthiasM
Avatar
Member since Nov 2003
459 posts
Quote by frahi:
Quote by MatthiasM:
...immer Interrupt! ! Ist das ein Fehler? Wie kriege ich das weg?

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: ...
Der Computer ist ein mechanischer Hohlkopf.
frahi
Avatar
Member since Nov 2002
777 posts
das soll natuerlich nicht kommen, waer auch sehr daemlich. vielleicht ein break im switch case vergessen?
MatthiasM
Avatar
Member since Nov 2003
459 posts
Oh, ja stimmt, in C muss man bei switch ja immer break oder return verwenden - danke für den Tipp  :-D
Der Computer ist ein mechanischer Hohlkopf.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen