WaitForSingleObject en un identificador de archivo?
Pregunta
¿Qué ocurre cuando se llama WaitForSingleObject()
en un mango que ha creado con CreateFile()
o _get_osfhandle()
?
Por razones que no vale la pena explicar quisiera utilizar WaitForSingleObject()
que esperar en un mango que he creado con _get_osfhandle(fd)
, donde fd
proviene de una llamada normal a _open()
. ¿Es esto posible?
Lo he probado en la práctica, y en algunas máquinas funciona como se esperaba (el mango está siempre en el estado señalado porque se puede leer más datos de él), y en algunas máquinas WaitForSingleObject()
bloqueará indefinidamente si se lo permites.
La página de MSDN para WaitForSingleObject()
dice que el único soportado cosas que maneja son "cambiar las notificaciones, la consola de entrada, eventos, notificaciones de recursos de memoria, mutex, procesos, semáforos, hilos, y temporizadores temporizador".
Además, sería diferente si utilicé CreateFile()
en lugar de _get_osfhandle()
en un descriptor de archivo CRT?
Solución
No lo haga. Como se puede ver, se ha indefinido comportamiento.
Aún cuando se define el comportamiento, se define de una manera tal que sea relativamente no es útil a menos que no le gusta escribir código adicional. Se señala cuando ninguna operación de E / S asíncrona en ese mango completa, que no se generaliza a la operación de seguimiento que O / I terminado.
¿Por qué estás tratando de esperar en un identificador de archivo? Es evidente que la intención es importante cuando usted está haciendo algo que no es ni siquiera el apoyo suficiente como para no bloquear indefinidamente.
Otros consejos
He encontrado los siguientes enlaces. El consenso parece a mí, no lo haga.
El esperar en un identificador de archivo
Cuando se inicia una operación de E / S en una asíncrono mango, el mango va en un estado no señalizado. Por lo tanto, cuando se utiliza en el contexto de una WaitForSingleObject o WaitForMultipleObjects operación, la identificador de archivo se convertirá señalado cuando la operación de E / S completa. Sin embargo, Microsoft desalienta activamente este técnica; que si no se generaliza existe más de una I pendiente / S operación; el mango se convertiría señalado si cualquier operación I / O terminado. Por lo tanto, aunque esta técnica es factible, no es las mejores prácticas en cuenta.
El uso de ReadDirectoryChangesW modo superpuesto. WaitForSingleObject se puede esperar en el caso en el estructura superpuesta.
También puede utilizar la API WaitForSingleObject () para esperar en una presentar el cambio si se utiliza la siguiente la función de notificación de cambio:
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 interesante sobre "maldad" de ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx