2011-07-26 18 views
12

मैं लिनक्स मशीन पर एपोल का उपयोग करके नेटवर्किंग प्रोग्राम पर काम कर रहा हूं और मुझे gdb से त्रुटि संदेश मिला है।सिगिप, टूटा हुआ पाइप

Program received signal SIGPIPE, Broken pipe. 
[Switching to Thread 0x7ffff609a700 (LWP 19788)] 
0x00007ffff7bcdb2d in write() from /lib/libpthread.so.0 
(gdb) 
(gdb) backtrace 
#0 0x00007ffff7bcdb2d in write() from /lib/libpthread.so.0 
#1 0x0000000000416bc8 in WorkHandler::workLoop()() 
#2 0x0000000000416920 in WorkHandler::runWorkThread(void*)() 
#3 0x00007ffff7bc6971 in start_thread() from /lib/libpthread.so.0 
#4 0x00007ffff718392d in clone() from /lib/libc.so.6 
#5 0x0000000000000000 in ??() 

मेरा सर्वर एन^2 समय की गणना कर रहा है और मैंने 500 कनेक्टेड उपयोगकर्ताओं के साथ सर्वर चलाने की कोशिश की। इस त्रुटि का कारण क्या हो सकता है? और मैं इसे कैसे ठीक करूं?


 while(1){ 
      if(remainLength >= MAX_LENGTH) 
       currentSentLength = write(client->getFd(), sBuffer, MAX_LENGTH); 
      else 
       currentSentLength = write(client->getFd(), sBuffer, remainLength); 


      if(currentSentLength == -1){ 
       log("WorkHandler::workLoop, connection has been lost \n"); 
       break; 
      } 
      sBuffer += currentSentLength; 
      remainLength -= currentSentLength; 

      if(remainLength == 0) 
       break; 
     } 
+4

सिगिपिप तब होता है जब आप बंद होने वाली पाइप को लिखने का प्रयास करते हैं, सुनिश्चित करें कि जिस पाइप को आप लिख रहे हैं वह बंद नहीं है। –

+0

अपना कोड पोस्ट करें। –

+0

एक उत्तर के रूप में पोस्ट करें ताकि हम इसे ऊपर उठा सकें। यह जितना संभव हो उतना जवाब है कि प्रश्न में कितनी छोटी जानकारी है। @ एलसीवाईएसओफ्ट: जीडीबी ट्रेस उन कार्यों के कोड के बिना बेकार है जो इसे कॉल करते हैं। –

उत्तर

24

जब आप एक पाइप (दूरस्थ अंत तक) है कि बंद कर दिया गया लिखें, अपने कार्यक्रम इस संकेत प्राप्त होगा। सरल कमांड लाइन फ़िल्टर प्रोग्राम के लिए, यह अक्सर एक उचित डिफ़ॉल्ट क्रिया होती है, क्योंकि SIGPIPE के लिए डिफ़ॉल्ट हैंडलर प्रोग्राम को समाप्त कर देगा।

एक बहुप्रचारित कार्यक्रम के लिए, पर सही कार्रवाई आमतौर पर सिग्पिप सिग्नल को अनदेखा करती है, ताकि एक बंद सॉकेट को लिखने से कार्यक्रम समाप्त नहीं हो सके।

ध्यान दें कि आप नहीं सफलतापूर्वक एक चेक लिखने से पहले प्रदर्शन कर सकते हैं, के बाद से दूरदराज के अंत अपना चेक और write() करने के लिए अपने कॉल के बीच में सॉकेट बंद कर सकते हैं।

अनदेखी SIGPIPE बारे में अधिक जानकारी के लिए इस सवाल का देखें: How to prevent SIGPIPEs (or handle them properly)

+0

कभी-कभी आपको एक सिगिप प्राप्त होता है क्योंकि रिमोट एंड ने कनेक्शन बंद कर दिया है * और आपको कभी नहीं बताया। * सिस्टम क्रैश इसे बहुत कारण बनाता है, क्योंकि वे खुले सॉकेट को साफ नहीं करते हैं, इसलिए आप नहीं जानते कि जब तक आप लिखते हैं तब तक सॉकेट चली जाती है इसके लिए कुछ और रिमोट एंड प्रोफेसर कनेक्शन का कोई ज्ञान नहीं है। –

+2

आप चेक को सफलतापूर्वक ठीक कर सकते हैं; आप बस _usefully_ ऐसा नहीं कर सकते हैं। :) –

+0

@ टोमालक गेरेकलल नहीं आप नहीं कर सकते। कोई सॉकेट एपीआई नहीं है जो आपको I/O ऑपरेशन करने की कोशिश करने के अलावा अन्य बताएगी। – EJP

2

आप SIGPIPE संकेतों को पकड़ने नहीं कर रहे हैं, लेकिन आप एक पाइप कि बंद टूट गया है/करने के लिए लिखने की कोशिश कर रहे हैं।

काफी आत्म-स्पष्टीकरण।

यह आमतौर पर एक नहीं सेशन के रूप में SIGPIPE संकेतों को संभालने, और अपने write कॉल जो कुछ भी आवेदन विशेष ढंग से आप की आवश्यकता ... चारों ओर त्रुटि मामले को संभालने के लिए की तरह this पर्याप्त है।

संबंधित मुद्दे