2009-04-21 21 views
12

Cosa succede quando si chiama WaitForSingleObject() su un handle creato con CreateFile() o _get_osfhandle()?WaitForSingleObject su un handle di file?

Per ragioni non vale la pena spiegare Vorrei utilizzare WaitForSingleObject() ad aspettare su una maniglia che ho creato con _get_osfhandle(fd), dove fd proviene da una normale chiamata a _open(). È possibile?

L'ho provato in pratica e su alcune macchine funziona come previsto (la MANIGLIA è sempre nello stato segnalato perché è possibile leggere più dati da esso), e su alcune macchine WaitForSingleObject() si bloccherà indefinitamente se lo si lascia .

La pagina MSDN per WaitForSingleObject() dice che le uniche cose supportate che gestisce sono "notifiche di modifiche, input di console, eventi, notifiche di risorse di memoria, mutex, processi, semafori, thread e timer di attesa".

Inoltre, sarebbe diverso se usassi CreateFile() invece di _get_osfhandle() su un descrittore di file CRT?

risposta

6

Non farlo. Come puoi vedere, ha un comportamento indefinito.

Anche quando il comportamento è definito, è definito in modo tale da non essere relativamente utile a meno che non ti piaccia scrivere codice aggiuntivo. Viene segnalato quando termina un'operazione I/E asincrona su quell'handle, che non generalizza al rilevamento di quale operazione I/O è stata completata.

Perché stai cercando di attendere un handle di file? Chiaramente l'intento è importante quando stai facendo qualcosa che non è nemmeno supportato abbastanza bene da non bloccare indefinitamente.

+2

L'operazione è ben definita. Questo è documentato in [GetOverlappedResult] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683209.aspx). Potrebbe essere scoraggiato, a causa del modo in cui è implementato, e potrebbe non essere generalmente utile. Ci sono opzioni migliori. Tuttavia, è ben definito. – IInspectable

7

Ho trovato i seguenti collegamenti. Il consenso mi sembra, non farlo.

In attesa di un file manico

Quando un'operazione di I/O è avviato su un manico asincrono , la maniglia va in uno stato non segnalato. Pertanto, se utilizzato nel contesto di un'operazione WaitForSingleObject WaitForSetleObject o WaitForMultipleObjects, l'handle del file verrà segnalato quando l'operazione di I/O viene completata. Tuttavia, Microsoft sconsiglia attivamente questa tecnica ; non generalizza se esiste più di una operazione I/O in attesa; la maniglia diventerebbe segnalata se qualsiasi operazione di I/O completata. Pertanto, sebbene la tecnica sia fattibile, non è considerata la migliore pratica da .

Usa ReadDirectoryChangesW in modalità sovrapposta.WaitForSingleObject può attendere l'evento nella struttura OVERLAPPED .

È inoltre possibile utilizzare l'API WaitForSingleObject() per attendere un cambiamento file se si utilizza la seguente funzione di notifica cambiamento:
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

Una nota interessante sul tema " cattiveria "di ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005/10/07/478396.aspx

Problemi correlati