select(2)
समारोह के व्यवहार जब किसी फ़ाइल वर्णनकर्ता यह पढ़ने के लिए देख रहा है एक और धागा द्वारा बंद कर दिया गया है क्या है?क्या करता है का चयन करें (2) आप एक अलग थ्रेड में (2) एक फ़ाइल वर्णनकर्ता बंद कर देते हैं?
कुछ सरसरी परीक्षण से, यह अभी वापसी करता है। मुझे लगता है परिणाम या तो है कि (क) यह अभी भी डेटा के लिए प्रतीक्षा करने के लिए जारी है, लेकिन अगर आप वास्तव में इसे से पढ़ने के लिए करने की कोशिश की आप EBADF मिल चाहते हैं (संभवतः - वहाँ एक संभावित दौड़ है) या (ख) है कि यह के रूप में यद्यपि दिखावा फ़ाइल वर्णनकर्ता में पारित नहीं किया गया। तो बाद वाली स्थिति, सच है कोई समय समाप्ति के साथ एक एकल fd में गुजर एक गतिरोध का कारण होता है, तो इसे बंद कर दिया गया था।
[सॉकेट चयन से बाहर तोड़ने का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/2486727/breaking-out-from-socket-select) – iammilind
मुझे लगता है कि यह अलग है, हालांकि थोड़ा सा संबंधित है। दूसरा सवाल स्पष्ट रूप से पूछ रहा है कि किसी अन्य थ्रेड से 'चयन()' से कैसे बाहर निकलना है (और 'पाइप()' एक अच्छा जवाब है), जबकि मेरा 'चयन (' 'पर 'बंद()' के व्यवहार के बारे में अधिक था।) 'एड सॉकेट। नीचे दिए गए उत्तरों में, आप देखेंगे कि जवाब है, "यह निर्भर करता है।" –
एक और रहस्यमय बग शिकारी में से एक मैं इस समस्या के कारण बाहर निकल गया: थ्रेड ए सॉकेट #x पर चयन कर रहा था, जो थ्रेड बी बंद था। इसके तुरंत बाद, थ्रेड सी ने एक नई सॉकेट बनाई, जो कि सॉकेट #x भी हुआ (क्योंकि नेटवर्किंग स्टैक ने नई सॉकेट के लिए नंबर एक्स का पुन: उपयोग करना चुना)। इस बिंदु पर थ्रेड ए (जो अभी भी सॉकेट # एक्स का उपयोग करने की कोशिश कर रहा था) ने थ्रेड सी की सॉकेट पर डेटा चुनना/पढ़ना/लिखना शुरू किया, भले ही उनके पास एक-दूसरे के साथ बिल्कुल तार्किक संबंध न हो। यह ट्रैक करने के लिए कुल दर्द था। –