WaitForSingleObject sur une poignée de fichier?
Question
Qu'est-ce qui se passe lorsque vous appelez WaitForSingleObject()
sur une poignée que vous avez créé avec CreateFile()
ou _get_osfhandle()
?
Pour des raisons pas la peine d'expliquer que je voudrais utiliser WaitForSingleObject()
attendre sur une poignée que j'ai créé avec _get_osfhandle(fd)
, où fd
provient d'un appel régulier à _open()
. Est-ce possible?
Je l'ai essayé dans la pratique, et sur certaines machines, il fonctionne comme prévu (la poignée est toujours dans l'état signalé parce que vous pouvez lire plus de données à partir), et sur certaines machines WaitForSingleObject()
va bloquer indéfiniment si vous le permettez.
La page MSDN pour WaitForSingleObject()
dit que le seul pris en charge les choses que les poignées sont « notifications de modification, entrée de la console, les événements, les notifications de ressources mémoire, mutex, sémaphores, processus, threads et minuteries waitable. »
De plus, serait-il différent si je CreateFile()
au lieu de _get_osfhandle()
sur un descripteur de fichier CRT?
La solution
Ne pas le faire. Comme vous pouvez le voir, il a un comportement non défini.
Même si le comportement est défini, il est défini de telle manière à être relativement pas utile à moins que vous ne l'aimez pas l'écriture de code supplémentaire. Il est signalé lorsqu'une opération d'E / S asynchrone sur cette poignée complète, qui ne généralise pas au suivi quelle opération d'E / S fini.
Pourquoi essayez-vous d'attendre sur une poignée de fichier? Il est clair que l'intention qui compte quand vous faites quelque chose qui ne sont même pas pris en charge assez bien pour ne pas bloquer indéfiniment.
Autres conseils
J'ai trouvé les liens suivants. Le concensus me semble, ne pas le faire.
En attente d'un descripteur de fichier
Quand une opération d'E / S est démarré sur un poignée asynchrone, la poignée va dans un état non signalé. Donc, lorsqu'il est utilisé dans le cadre d'un WaitForSingleObject ou opération WaitForMultipleObjects, la poignée de fichier deviendra signalé lors l'opération d'E / S est terminée. cependant, Microsoft décourage activement cette technique; il ne généralise pas si il existe plus d'un E / S en attente opération; la poignée deviendrait signalée si une opération d'E / S terminé. Par conséquent, bien que cela technique est réalisable, il est les meilleures pratiques en considération.
Utilisation ReadDirectoryChangesW en le mode chevauchée. WaitForSingleObject peut attendre l'événement dans le struct surimposées.
Vous pouvez également utiliser l'API d'attendre sur un WaitForSingleObject () déposer le changement si vous utilisez ce qui suit changement fonction de notification:
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.aspUne note intéressante sur "méchancetés" de ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx