2009-04-21 9 views
12

क्या होता है जब आप WaitForSingleObject() को CreateFile() या _get_osfhandle() के साथ बनाए गए हैंडल पर कॉल करते हैं तो क्या होता है?एक फ़ाइल हैंडल पर WaitForSingleObject?

कारणों के लायक समझा मैं WaitForSingleObject() उपयोग करने के लिए एक हैंडल है कि मैं, _get_osfhandle(fd) साथ बना लिया है जहां fd_open() के लिए एक नियमित कॉल से आता है पर इंतजार करना चाहते हैं नहीं है। क्या यह संभव है?

मैंने इसे अभ्यास में आजमाया है, और कुछ मशीनों पर यह अपेक्षित काम करता है (हैंडल हमेशा संकेतित स्थिति में है क्योंकि आप इससे अधिक डेटा पढ़ सकते हैं), और कुछ मशीनों पर WaitForSingleObject() अनिश्चित काल तक अवरुद्ध हो जाएगा यदि आप इसे देते हैं ।

WaitForSingleObject() के लिए एमएसडीएन पृष्ठ का कहना है कि केवल एक ही समर्थित चीजें हैं जो इसे नियंत्रित करती हैं "अधिसूचनाएं, कंसोल इनपुट, घटनाओं, स्मृति संसाधन अधिसूचनाओं, म्यूटेक्स, प्रक्रियाओं, सेमफोर, धागे और प्रतीक्षा करने योग्य टाइमर बदलती हैं।"

इसके अतिरिक्त, अगर मैं _get_osfhandle() के बजायका उपयोग सीआरटी फ़ाइल डिस्क्रिप्टर पर करता तो यह अलग होगा?

उत्तर

6

ऐसा मत करो। जैसा कि आप देख सकते हैं, इसने व्यवहार को अपरिभाषित किया है।

तब भी जब व्यवहार परिभाषित किया जाता है, तब तक यह अपेक्षाकृत उपयोगी नहीं होता है जब तक आप अतिरिक्त कोड लिखना पसंद नहीं करते। यह संकेत दिया जाता है कि उस संभाल पर किसी भी एसिंक्रोनस I/O ऑपरेशन पूर्ण हो जाता है, जो I/O ऑपरेशन को समाप्त करने के लिए सामान्यीकृत नहीं करता है।

आप फ़ाइल हैंडल पर प्रतीक्षा करने का प्रयास क्यों कर रहे हैं? स्पष्ट रूप से इरादा मायने रखता है जब आप ऐसा कुछ कर रहे हैं जो अनिश्चित काल तक अवरुद्ध न होने के लिए पर्याप्त रूप से पर्याप्त समर्थित नहीं है।

+2

ऑपरेशन अच्छी तरह से परिभाषित है। यह [GetOverlappedResult] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683209.aspx) के अंतर्गत प्रलेखित है। इसे कार्यान्वित करने के तरीके से निराश हो सकता है, और आमतौर पर उपयोगी नहीं हो सकता है। बेहतर विकल्प हैं। हालांकि, यह अच्छी तरह से परिभाषित है। – IInspectable

7

मुझे निम्नलिखित लिंक मिल गए। आम सहमति मुझे लगता है, ऐसा मत करो।

एक फ़ाइल पर प्रतीक्षा की जा रही संभाल

जब एक आई/ओ आपरेशन एक अतुल्यकालिक हैंडल पर शुरू कर दिया है, संभाल एक गैर संकेत राज्य में चला जाता है। इसलिए, जब एक WaitForSingleObject या WaitForMultipleObjects आपरेशन के संदर्भ में प्रयोग किया, फ़ाइल संभाल संकेत हो जाएगा जब आई/ओ आपरेशन पूरा करती है। हालांकि, माइक्रोसॉफ्ट सक्रिय रूप से इस तकनीक को हतोत्साहित करता है; अगर में एक से अधिक लंबित I/O ऑपरेशन मौजूद है तो यह सामान्यीकृत नहीं होता है; हैंडल बन जाएगा अगर कोई I/O ऑपरेशन पूरा हो गया है। इसलिए, हालांकि यह तकनीक व्यवहार्य है, यह सर्वोत्तम अभ्यास नहीं माना जाता है।

उपयोग ReadDirectoryChangesW।WaitForSingleObject OVERLAPPED संरचना में ईवेंट पर प्रतीक्षा कर सकता है।

तुम भी एक फ़ाइल परिवर्तन पर प्रतीक्षा करने के लिए एपीआई WaitForSingleObject() का उपयोग कर सकते हैं अगर आप निम्नलिखित परिवर्तन सूचना समारोह का उपयोग करें:
FindFirstChangeNotification()
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/findfirstchangenotification.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp

पर "एक दिलचस्प टिप्पणी बुराई "ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005/10/07/478396.aspx

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