geFORK()tes Kind schliesst fremde sockets

martin.heyer@gmx.de martin.heyer at gmx.de
Sam Sep 13 15:06:34 CEST 2003


> On Sat, 2003-09-13 14:32:22 +0200, martin.heyer at gmx.de 
> <martin.heyer at gmx.de> 
> wrote in message <30775.1063456342 at www13.gmx.net>: 
> > Hallo Tlug.  
> > Ich habe ein Serverprogramm, welches die Clients zwecks 
> Absturzsicherheit 
>   
> > mit fork() in einer extra-Routine behandelt (Wenn diese Segfaultet soll 
> d 
> er 
> > Rest  
> > stehen bleiben).  
> > Diese Routine braucht eigentlich nur das Socket vom accept(), und das 
> > kopiert  
> > fork(). Dummerweise scheint der gefork()te Kindprozess beim finalen 
> retur 
> n() 
> >  
> > automatisch die anderen FDs (so auch das socket fuers listen() ) zu 
> > schliessen.  
> > (Sagt strace).  
>  
> Der Kind-Prozeß kann keine FDs seines Vaters mehr schließen. 
>  
> > Habe ich da eine Option (sowas wie CLOEXEC...) uebersehen oder ist das  
> > ganze von prinzipieller Natur?  
>  
> Weder, noch. Strace einfach mal den Pappi, da ist bestimmt noch'n Bock 
> d'rin:)  
>  
> *amkopfkratz* ...oder willst Du sowas machen: 
>  
> Vater				| Kind 
> --------------------------------+------------- 
> socket();			| 
> bind();				| 
> listen();			| 
> while(1) {			| 
> 	accept();		| 
> 	fork();			| 
> 				| do_some_work(); 
> 				| exit(); 
> 	do_some_more_work();	| 
> 	close();		| 
> }				| 
>  
> Sowas macht man gemeinhin nicht:) Wenn man die Bearbeitung eines Clients 
> abgibt (z.B. an ein via fork() erzeugten Prozeß), dann sollte der 
> _alles_ machen, was für den Client gemacht wird... 
>  
> MfG, JBG 
>  
Das ging aber schnell... :) 
Wenn der Child-Prozess ueber exit() aussteigt, dann scheints zu gehen. 
Es sieht aber irgendwie sauberer aus, wenn er das return der main()-Funktion
nimmt. 
Der geforkte client-Prozess soll alles für den  Client machen, aber nicht am

server-Socket (listen) spielen. 
Ich dachte jetzt, die beiden Prozesse greifen über den socketFd auf ein und
dasselbe 
Socket zu, wenn der eine das schliesst hat der andere Pech. 
So ähnlich sieht nämlich auch das Resultat hier aus... 
Oder wird das Socket erst geschlossen, wenn der letzte ein shutdown/close 
gemacht hat? 
 
> --  
>    Jan-Benedict Glaw       jbglaw at lug-owl.de    . +49-172-7608481 
>    "Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen 
> Krieg 
>     fuer einen Freien Staat voll Freier Bürger" | im Internet! |   im Ira 
> k! 
>       ret = do_actions((curr | FREE_SPEECH) & ~(IRAQ_WAR_2 | DRM | TCPA));

>