PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Signal vor select()



7.e.Q
31-03-2005, 10:36
Hallo,

in einem unserer Programme wird eine Reihe von Filedeskriptoren per select() abgepollt, und es werden entsprechende Funktionen aufgerufen, wenn Daten anstehen. Die Daten, die in den Filedeskriptoren anstehen, sind umgelenkte Ausgaben von Child-Prozessen.

Der Signal-Handler für SIGCHILD schließt die Pipes, über die die Kommunikation abläuft.

Ihr versteht? Ihr seht, wo das Problem entstehen wird? Ich brauche Hilfe dabei, also bitte fragt, wenn ihr noch weitere Informationen braucht. Der Sourcecode ist leider zu komplex und unterliegt den Rechten der Firma, daher darf ich den hier nicht posten, aber meine Erläuterungen sollten Information genug sein.

So...

Was passiert nun, wenn ein Child-Prozess so schnell fertig ist, daß es ein SIGCHILD an den pollenden Parent-Prozess sendet, bevor select die Filedeskriptoren abfragt? Wenn der Parent daraufhin auf das Signal reagiert und die Pipes zumacht, bevor select diese abfragen kann, gehen die Daten darin doch definitiv verloren oder?

Ich versuch den Ablauf nochmal bildlich darzustellen:



Parent Child
|
|
|
|
started Child |
| macht Ausgaben in die Pipe (umgelenkte stdout)
| beendet sich (sendet SIGCHILD an Parent)
erhält SIGCHILD
schließt die Pipes
|
|
|
|
pollt die Pipes ab
keine Daten verfügbar
|
|
|
|
|
.
.
.


Was unternimmt man dagegen?

tanis
31-03-2005, 14:48
Hallo,

wenn ich das richtig verstehe, dann kannst du doch einfach vor dem schließen der Pipe ueberpruefen ob auf ihr noch Daten sind. Koenntest du ja im SignalHaendler machen, da du an der Stelle auch gleich die Information hast welcher Prozess weg vom Fenster ist und somit kannste auch die Pipe ausfindig machen.

MfG tanis

7.e.Q
04-04-2005, 13:31
Jo, gesagt, getan, funktioniert, super! Danke! :) :D