2009-04-21 16 views
12

¿Qué sucede cuando llama al WaitForSingleObject() en un mango que ha creado con CreateFile() o _get_osfhandle()?WaitForSingleObject en un identificador de archivo?

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 posible?

Lo he probado en la práctica, y en algunas máquinas funciona como se esperaba (la MANIJA siempre está en estado señalizado porque puede leer más datos de ella), y en algunas máquinas WaitForSingleObject() se bloqueará indefinidamente si se lo permite .

La página MSDN para WaitForSingleObject() dice que las únicas cosas admitidas que maneja son "notificaciones de cambio, entrada de consola, eventos, notificaciones de recursos de memoria, mutex, procesos, semáforos, subprocesos y temporizadores temporales".

Además, ¿sería diferente si usara CreateFile() en lugar de _get_osfhandle() en un descriptor de archivo CRT?

Respuesta

6

No lo hagas. Como puede ver, tiene un comportamiento indefinido.

Incluso cuando se define el comportamiento, se define de tal manera que no es relativamente útil a menos que no desee escribir código adicional. Se señaliza cuando se completa cualquier operación de E/S asincrónica en ese identificador, que no se generaliza para rastrear qué operación de E/S finalizó.

¿Por qué intentas esperar en un manejador de archivo? Claramente, la intención importa cuando se está haciendo algo que ni siquiera se admite lo suficiente como para no bloquearlo indefinidamente.

+2

La operación está bien definida. Esto está documentado en [GetOverlappedResult] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683209.aspx). Se puede desalentar, debido a la forma en que se implementa, y puede no ser útil en general. Hay mejores opciones. Sin embargo, está bien definido. – IInspectable

7

Encontré los siguientes enlaces. El consenso me parece, no lo hagas.

espera en un identificador de archivo

Cuando se inicia una operación de E/S en un mango asíncrono, el mango va en un estado no señalado. Por lo tanto, cuando se usa en el contexto de una operación WaitForSingleObject o WaitForMultipleObjects, el identificador de archivo se señalará cuando se complete la operación de E/S . Sin embargo, Microsoft desalienta activamente esta técnica ; no se generaliza si existe más de una operación pendiente de E/S ; el identificador se convertiría en señalizado si se completó cualquier operación de E/S . Por lo tanto, aunque esta técnica es factible, no se considera la mejor práctica.

Uso ReadDirectoryChangesW en modo solapado.WaitForSingleObject puede esperar en el evento en la estructura OVERLAPPED.

También puede utilizar la API de WaitForSingleObject() para esperar en un cambio archivo si utiliza la siguiente función de notificación 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

Cuestiones relacionadas