2009-04-21 15 views
12

Was passiert, wenn Sie WaitForSingleObject() auf einem Handle aufrufen, das Sie mit CreateFile() oder _get_osfhandle() erstellt haben?WaitForSingleObject auf einem Datei-Handle?

Für nicht wert Gründe erklären ich WaitForSingleObject() auf einem Griff zu warten, verwenden möchte, dass ich mit _get_osfhandle(fd) erstellt haben, wo fd-_open() von einem normalen Anruf kommt. 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 WaitForSingleObject() blockiert, wenn Sie es zulassen . Die MSDN-Seite für WaitForSingleObject() besagt, dass die einzigen unterstützten Dinge, die es handhabt, sind "Benachrichtigungen ändern, Konsoleneingabe, Ereignisse, Speicherressourcenbenachrichtigungen, Mutex, Prozesse, Semaphore, Threads und Waitable-Timer."

Zusätzlich würde es anders sein, wenn ich CreateFile() anstelle von _get_osfhandle() auf einem CRT-Dateideskriptor verwenden würde?

Antwort

6

Tun Sie es nicht. Wie Sie sehen können, hat es ein undefiniertes Verhalten.

Auch wenn das Verhalten definiert ist, ist es so definiert, dass es relativ wenig sinnvoll ist, es sei denn, Sie möchten keinen zusätzlichen Code schreiben. Es wird signalisiert, wenn eine asynchrone E/A-Operation für dieses Handle abgeschlossen ist, was nicht für das Verfolgen der E/A-Operation verallgemeinert wird.

Warum versuchen Sie auf einen Dateizugriffspunkt zu warten? Offensichtlich ist die Absicht wichtig, wenn Sie etwas tun, das nicht einmal gut genug unterstützt wird, um nicht unbegrenzt zu blockieren.

+2

Die Operation ist gut definiert. Dies ist dokumentiert unter [GetOverlappedResult] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683209.aspx). Es kann entmutigt werden, aufgrund der Art und Weise wie es implementiert wird, und möglicherweise nicht allgemein nützlich sein. Es gibt bessere Möglichkeiten. Es ist jedoch gut definiert. – IInspectable

7

Ich habe die folgenden Links gefunden. Der Konsens scheint mir, tue es nicht.

auf einer Datei handhaben Warten

Wenn eine E/A-Operation an einem asynchronen Griff gestartet wird, geht der Griff in einen nicht-signalisierten Zustand. Daher wird im Zusammenhang mit einer WaitForSingleObject oder WaitForMultipleObjects-Operation das Dateihandle signalisiert, wenn der E/A-Vorgang abgeschlossen ist. Jedoch, Microsoft entmutigt aktiv diese Technik; es verallgemeinert sich nicht, wenn mehr als eine ausstehende E/A Operation vorhanden ist; Der Handle würde werden, wenn eine beliebige E/A-Operation abgeschlossen ist. Obwohl diese Technik machbar ist, wird sie daher nicht als Best Practice angesehen.

Verwenden ReadDirectoryChangesW in überlappten Modus.WaitForSingleObject kann auf das Ereignis in der OVERLAPPED-Struktur warten.

Sie können auch die API verwenden WaitForSingleObject() auf einer Dateiänderung zu warten, wenn Sie die folgende Änderungsbenachrichtigung Funktion:
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

Einen interessanten Hinweis auf " Übelkeit "von ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005/10/07/478396.aspx

Verwandte Themen