WaitForSingleObject su un handle di file?
Domanda
Che cosa accade quando si chiama WaitForSingleObject()
su un manico che hai creato con CreateFile()
o _get_osfhandle()
?
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?
ho provato in pratica, e su alcune macchine funziona come previsto (la maniglia è sempre in stato segnalato perché è possibile leggere più dati da esso), e su alcune macchine WaitForSingleObject()
possa bloccare a tempo indeterminato se lo lasciate.
La pagina di MSDN per WaitForSingleObject()
dice che l'supportato solo le cose che le maniglie sono "cambiare le notifiche, console di input, eventi, notifiche risorse di memoria, mutex, i processi, i semafori, le discussioni e timer waitable."
Inoltre, sarebbe diverso se ho usato CreateFile()
invece di _get_osfhandle()
su un descrittore di file CRT?
Soluzione
Non farlo. Come si può vedere, è non definito comportamento.
Anche quando il comportamento è definito, è definito in modo tale da essere relativamente non utile a meno che non ti piace la scrittura di codice aggiuntivo. Si è segnalata quando tutte le operazioni di I / O asincrono su quella maniglia completa, che non generalizzare al tracking che I / O operazione finito.
Perché stai cercando di aspettare un handle di file? Chiaramente l'intento conta quando si sta facendo qualcosa che non è nemmeno supportata abbastanza bene per non bloccare a tempo indeterminato.
Altri suggerimenti
Ho trovato i seguenti link. Il concensus mi sembra, non farlo.
In attesa di un handle di file
Quando un'operazione di I / O è avviato su un maniglia asincrono, la maniglia va in uno stato non-signal. Perciò, quando usato nel contesto di un WaitForSingleObject o operazione WaitForMultipleObjects, il handle di file diventerà segnalato quando l'operazione di I / O completa. Però, Microsoft scoraggia attivamente questo tecnica; non generalizzare, se esiste più di uno in attesa di I / O funzionamento; la maniglia diventerebbe segnalato se qualsiasi operazione di I / O completato. Pertanto, anche se questo tecnica è fattibile, non è le migliori pratiche in considerazione.
Usa ReadDirectoryChangesW in modalità sovrapposta. WaitForSingleObject vedo l'ora sull'evento nel struct OVERLAPPED.
È anche possibile utilizzare l'API WaitForSingleObject () per attendere su un modifica del file se si utilizza il seguente funzione di notifica di modifica:
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.aspUna nota interessante sulla "cattiveria" di ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx