Toon posts:

[C] file descripters en processen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een daemon aan het klussen onder Linux. Een process pre-forked een aantal childs, luistert naar een socket en geeft een nieuwe socket van een binnenkomende connectie via een pipe door aan een van de childs. Binnen de child krijg ik een 'bad file descripter' als ik de socket probeert uit te lezen met recv() omdat de socket niet bij dat proces hoort. Hoe krijg ik dat toch voor elkaar?

Verwijderd

Hmmm. Is het niet handiger een parent-process te maken dat pas forked als er een connectie binnenkomt?

Verwijderd

Topicstarter
Verwijderd schreef op 21 oktober 2002 @ 12:30:
Hmmm. Is het niet handiger een parent-process te maken dat pas forked als er een connectie binnenkomt?
Dit is geen antwoord op mijn vraag.....

Apache werkt met een zelfde soort truuk, dus het moet kunnen.

Verwijderd

Kijk dan in de source van apache, slimmerd.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:26
Het is wel een beetje een antwoord op je vraag. Bij het forken worden je file descriptors immers gekopieerd (feitelijk krijg je een nieuwe set file descriptors, die wel naar de oude files verwijzen). Als je dus een connectie accepteert en dan pas forked, weet je zeker dat je file descriptor nog geldig is in het nieuwe proces.

Verder zou ik geen manier weten om die file descriptors heen en weer te sturen, eigenlijk. Maar zoals je zegt, lukt het Apache inderdaad toch. Misschien is het een idee om even in de Apache code te spieken?

Verwijderd

Topicstarter
Weet je wat voor een tering werk dat is. Dacht dat een vraag hier posten me sneller op weg zou helpen.....

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:26
Verwijderd schreef op 21 oktober 2002 @ 12:59:
Weet je wat voor een tering werk dat is. Dacht dat een vraag hier posten me sneller op weg zou helpen.....
Apache code is best wel netjes hoor. Staan zelfs hier en daar wat comments tussen. (Al ben ik - serieus! - ook comments tegengekomen als: " I have no idea what this does" :) ).

Maar goed, een beetje moeite doen mag best. Misschien komt iemand nog met een lumineus idee (zou goed kunnen), maar zoniet, dan kun je in ieder geval verder.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Onder Windows moet je expliciet met DuplicateHandle een handle kopieren naar de process space van een ander process, ik heb vergelijkbare trucs uitgehaald daarmee. Denk dat er onder Linux ook wel zo'n functie moet zijn.

Professionele website nodig?


Verwijderd

Verwijderd schreef op 21 oktober 2002 @ 12:18:
Ik ben een daemon aan het klussen onder Linux. Een process pre-forked een aantal childs, luistert naar een socket en geeft een nieuwe socket van een binnenkomende connectie via een pipe door aan een van de childs. Binnen de child krijg ik een 'bad file descripter' als ik de socket probeert uit te lezen met recv() omdat de socket niet bij dat proces hoort. Hoe krijg ik dat toch voor elkaar?
Ten eerste sorry dat ik niet eerder antwoord, ik ben er een paar daagjes tussenuit geweest.

En nu de oplossing :) Het antwoord is simpel: je pakt het verkeerd aan. Je moet zorgen dat het parent process de listening socket heeft geopend en aan het listenen is voordat je je children forked (op die manier hebben alle children de beschikking over die socket). Vervolgens poll/select je die socket in de parent, en als er activiteit is vertel je een child (dat nog niet bezet is) via zijn pipe dat het child de socket moet accepten (en dus niet de parent).
Pagina: 1