WaitForSingleObject auf einem Datei-Handle?
Frage
Was passiert, wenn Sie WaitForSingleObject()
auf einem Griff rufen Sie mit CreateFile()
oder _get_osfhandle()
erstellt haben?
Aus Gründen nicht wert zu erklären Ich möchte WaitForSingleObject()
verwenden, um auf einem Griff zu warten, dass ich mit _get_osfhandle(fd)
erstellt habe, wo fd
von einem normalen Anruf kommt _open()
. Ist das möglich?
Ich habe es in der Praxis erprobt und auf einigen Maschinen es wie erwartet funktioniert (Der Griff ist immer in dem signalisierten Zustand, weil Sie mehr Daten lesen können), und auf einigen Maschinen auf unbestimmte Zeit blockieren WaitForSingleObject()
wenn Sie es zulassen.
Die MSDN-Seite für WaitForSingleObject()
sagt, dass die einzigen Dinge unterstützt, die es Griffe sind „Benachrichtigungen ändern, Konsole-Eingang, Ereignisse, Speicherressourcenbenachrichtigungen, Mutex, Prozesse, Semaphore, Threads und wartbar Timer.“
Zusätzlich wäre es anders, wenn ich CreateFile()
statt _get_osfhandle()
auf einem CRT-Dateideskriptor verwendet?
Lösung
Sie es nicht tun. Wie Sie sehen können, hat es sich das Verhalten nicht definiert.
Auch wenn das Verhalten definiert ist, ist es in einer solchen Art und Weise definiert als relativ nicht sinnvoll zu sein, es sei denn, Sie möchten keine zusätzlichen Code zu schreiben. Es wird signalisiert, wenn eine asynchrone E / A-Operation an diesem Griff vervollständigt, die aber keinen Tracking nicht verallgemeinern, die I / O-Operation abgeschlossen.
Warum versuchen Sie, auf einer Datei-Handle zu warten? Klar, dass die Absicht zählt, wenn Sie etwas tun, das nicht einmal gut genug unterstützt wird, nicht auf unbestimmte Zeit blockiert werden.
Andere Tipps
Ich fand die folgenden Links. Die Konsensus mir scheint, tut es nicht.
Das Warten auf einen Datei-Handle
Wenn eine I / O-Operation auf einem gestartet asynchroner Handgriff, wobei der Griff geht in einen nicht-signalisierten Zustand. Deshalb, wenn sie im Rahmen eines gebrauchten WaitForSingleObject oder WaitForMultipleObjects Betrieb, die Datei-Handle wird geworden signalisiert, wenn die I / O-Operation abgeschlossen ist. Jedoch, Microsoft schreckt dies aktiv Technik; es verallgemeinert nicht, wenn gibt es mehr als eine anstehende E / A Betrieb; der Griff würde wenn eine I / O-Operation signalisiert, vollendet, fertiggestellt. Daher wird, obwohl dies Technik machbar ist, ist es nicht als am beste Praxis.
Verwenden ReadDirectoryChangesW in überlappten Modus. WaitForSingleObject kann auf das Ereignis warten in der ÜBERLAPPVERBINDUNG Struktur.
Sie können auch die API verwenden WaitForSingleObject () auf eine warten Datei ändern, wenn Sie die folgende verwenden Wechselmitteilungsfunktion:
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.aspEine interessante Anmerkung zu „Bösartigkeit“ von ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx