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?

Était-ce utile?

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

     

Une note intéressante sur "méchancetés" de ReadDirectoryChangesW:
   http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top