[C++] Linux error: broken pipe

Pagina: 1
Acties:
  • 202 views sinds 30-01-2008
  • Reageer

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik heb in C++ een server geschreven en af en toe 'crasht' die met de mededeling: broken pipe (ook wel eens met segmentation fault, maar dat is een ander verhaal). Waardoor wordt deze error veroorzaakt?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

http://www.die.net/doc/linux/man/man7/signal.7.html
"Broken pipe: write to pipe with no readers".
Waarschijnlijk schrijf je naar een pipe waar nooit uit word gelezen? Als dat niet zo is, kijk eens wat er gebeurd als je SIGPIPE negeert.
Anyway... het blijft gokken zo zonder enige omschrijving en/of code ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik had geen idee wat broken pipe betekende, dus om de juiste code te posten was een beetje lastig.

Ik read/write naar sockets en ik write naar cerr en cout. Kan schrijven naar cerr/cout dit signaal veroorzaken?

[ Voor 50% gewijzigd door Olaf van der Spek op 25-05-2003 20:16 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

Naar cerr en cout mag dat niet veroorzaken. Als je met sockets in de weer bent kan ik me voorstellen dat je daar ergens een foutje hebt gemaakt. Maar als je opgeeft dat het signal SIGPIPE genegeert moet worden, werkt je server dan nog steeds?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik heb ook geen idee hoe ik signalen kan negeren, dus ik kan het niet even snel uitproberen. Maar welke socket-related event genereerd SIGPIPE dan?

[ Voor 24% gewijzigd door Olaf van der Spek op 25-05-2003 20:18 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

OlafvdSpek schreef op 25 mei 2003 @ 20:16:
Ik heb ook geen idee hoe ik signalen kan negeren, dus ik kan het niet even snel uitproberen. Maar welke socket-related event genereerd SIGPIPE dan?
Als de verbinding is verbroken, en je schrijft naar de socket, of je probeert er van te lezen dan krijg je dus dat broken pipe signal. De standaard actie die word ondernomen is het programma beeindigen. M.b.v. signal() (zie man 2 signal en man 7 signal) kan je actie ondernemen als dit gebeurt, of zelfs de signal geheel negeren als je op een andere manier al dedecteerd of de connectie nog bestaat of niet.

Maak je gebruik van write()? Deze geeft een EPIPE terug als er niet geschreven kan worden naar de socket. Echter voordat write() returnt en de EPIPE teruggeeft krijg je de SIGPIPE al, waardoor het proces word beeindigt, en je de EPIPE niet kan afvangen.

En wat google me ook nog gaf ;) :
http://www.experts-exchan...nguages/C/Q_10033384.html

[ Voor 7% gewijzigd door Creepy op 25-05-2003 21:10 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Nee, ik gebruik send. Maar waarom wordt er een signal gestuurd in plaats van gewoon via de return value aan te geven dat er iets fout is gegaan?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:31
Ik dacht dat er op een gegeven moment ook een SIGCHLD signaal komt als verbinding wordt verbroken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
SIGCHLD: Child stopped or terminated
Alleen als je multi-threading zonder thread pooling gebruikt. Ik gebruik geen multi-threading.

Weet iemand toevallig ook hoe ik deze server kan laten draaien vanuit een SSH sessie zelfs nadat ik de SSH sessie zelf afsluit?

[ Voor 31% gewijzigd door Olaf van der Spek op 26-05-2003 10:07 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

OlafvdSpek schreef op 26 May 2003 @ 09:36:
[...]

Alleen als je multi-threading zonder thread pooling gebruikt. Ik gebruik geen multi-threading.

Weet iemand toevallig ook hoe ik deze server kan laten draaien vanuit een SSH sessie zelfs nadat ik de SSH sessie zelf afsluit?
Das makkelijk ;)

nohup /mijn/server/executable/hier &

M.b.v. fork o.i.d. moet het ook mogelijk zijn om je server proces zichzelf in de background te laten zetten... hoe dat moet weet ik echter niet...

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Creepy schreef op 26 May 2003 @ 15:26:
M.b.v. fork o.i.d. moet het ook mogelijk zijn om je server proces zichzelf in de background te laten zetten... hoe dat moet weet ik echter niet...
Deze heb ik es gebruikt om een daemon te creëren voor linux:
http://www.linuxjournal.com/article.php?sid=2335

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

Glimi schreef op 26 mei 2003 @ 15:44:
[...]


Deze heb ik es gebruikt om een daemon te creëren voor linux:
http://www.linuxjournal.com/article.php?sid=2335
Cool.. ik was net opzoek naar dit soort info. Thanx :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Creepy schreef op 26 mei 2003 @ 17:27:
Cool.. ik was net opzoek naar dit soort info. Thanx :)
Wat voor server ben je aan het schrijven?
Inderdaad zeer handige info, alleen het model dat ik gebruik (single-threading) stond er niet in.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

OlafvdSpek schreef op 26 mei 2003 @ 17:57:
[...]

Wat voor server ben je aan het schrijven?
Inderdaad zeer handige info, alleen het model dat ik gebruik (single-threading) stond er niet in.
Een deamon om LCD's aan te sturen (ala lcdproc, zie lcdproc.omnipotent.net). In eerste instantie gaat mijn deamon met pipes werken i.p.v. TCP, maar ik ben wel van plan een TCP plugin te schrijven zodat je eventueel ook remote het LCD kan aansturen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik heb een iets nettere manier gevonden om die pijpen heel te houden: geef MSG_NOSIGNAL mee aan recv en send.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

OlafvdSpek schreef op 27 May 2003 @ 00:04:
Ik heb een iets nettere manier gevonden om die pijpen heel te houden: geef MSG_NOSIGNAL mee aan recv en send.
Nice! Die heb ik over het hoofd gezien.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • igmar
  • Registratie: April 2000
  • Laatst online: 29-06 18:56

igmar

ISO20022

OlafvdSpek schreef op 25 May 2003 @ 16:10:
Ik heb in C++ een server geschreven en af en toe 'crasht' die met de mededeling: broken pipe (ook wel eens met segmentation fault, maar dat is een ander verhaal). Waardoor wordt deze error veroorzaakt?
Doordat je schrijft naar een socket waar aan de andere kant geen listener meer voor is. MAW : De andere kant heeft de connectie gesloten.

Normaliter krijg je dan een SIGPIPE, maar met de juiste opties aan send() kun je ervoor zorgen dat send() een EPIPE teruggeeft. Een sigpipe is in ieder geval het teken om je connectie te sluiten :)

  • igmar
  • Registratie: April 2000
  • Laatst online: 29-06 18:56

igmar

ISO20022

OlafvdSpek schreef op 26 May 2003 @ 09:36:
[...]
Weet iemand toevallig ook hoe ik deze server kan laten draaien vanuit een SSH sessie zelfs nadat ik de SSH sessie zelf afsluit?
man 3 daemon()

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
code:
1
2
# man 3 daemon()
-bash: syntax error near unexpected token `('

;->

Bedankt voor deze hint, maar zoals je had kunnen lezen waren beide problemen al opgelost.
Pagina: 1