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?

¿Fue útil?

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.asp

     

Una nota interesante sobre "maldad" de ReadDirectoryChangesW:
   http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top