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?
Dit is geen antwoord op mijn vraag.....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?
Apache werkt met een zelfde soort truuk, dus het moet kunnen.
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?
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?
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"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.....
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.
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.
Verwijderd
Ten eerste sorry dat ik niet eerder antwoord, ik ben er een paar daagjes tussenuit geweest.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?
En nu de oplossing
Pagina: 1