2009-04-21 8 views
12

Que se passe-t-il lorsque vous appelez WaitForSingleObject() sur un descripteur que vous avez créé avec CreateFile() ou _get_osfhandle()?WaitForSingleObject sur un descripteur de fichier?

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é en pratique, et sur certaines machines cela fonctionne comme prévu (le HANDLE est toujours dans l'état signalé car vous pouvez lire plus de données), et sur certaines machines WaitForSingleObject() bloquera indéfiniment si vous le laissez . La page MSDN pour WaitForSingleObject() indique que les seules choses prises en charge sont «les notifications de modification, les entrées de console, les événements, les notifications de ressources mémoire, les mutex, les processus, les sémaphores, les threads et les minuteurs attendus».

De plus, cela serait-il différent si j'utilisais CreateFile() au lieu de _get_osfhandle() sur un descripteur de fichier CRT?

Répondre

6

Ne le faites pas. Comme vous pouvez le voir, il a un comportement indéfini.

Même lorsque le comportement est défini, il est défini de manière à ne pas être utile sauf si vous n'aimez pas écrire du code supplémentaire. Il est signalé lorsqu'une opération d'E/S asynchrone sur cette poignée est terminée, ce qui ne généralisera pas le suivi de l'opération d'E/S terminée. Pourquoi essayez-vous d'attendre sur un descripteur de fichier?

Pourquoi? Il est clair que l'intention compte quand vous faites quelque chose qui n'est même pas assez bien supporté pour ne pas bloquer indéfiniment.

+2

L'opération est bien définie. Cela est documenté sous [GetOverlappedResult] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683209.aspx). Il peut être découragé, en raison de la façon dont il est mis en œuvre, et peut ne pas être généralement utile. Il y a de meilleures options. Cependant, il est bien défini. – IInspectable

7

J'ai trouvé les liens suivants. Le consensus me semble, ne le faites pas.

attente sur un handle de fichier

Lorsqu'une opération d'E/S est démarré sur une poignée asynchrone, la poignée va dans un état non signalé. Par conséquent, lorsqu'il est utilisé dans le contexte d'une opération WaitForSingleObject ou WaitForMultipleObjects, le handle de fichier sera signalé lorsque l'opération d'E/S se termine. Cependant, Microsoft déconseille activement cette technique ; il ne généralise pas si existe plus d'une opération d'E/S en attente ; la poignée deviendrait si une opération d'E/S était terminée. Par conséquent, bien que cette technique soit réalisable, elle n'est pas considérée comme la meilleure pratique.

Utilisation ReadDirectoryChangesW en le mode chevauchée.WaitForSingleObject peut attendre sur l'événement dans la struct OVERLAPPED.

Vous pouvez également utiliser l'API WaitForSingleObject() pour attendre un changement de fichier si vous utilisez la fonction de notification de modification suivante:
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é "de ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005/10/07/478396.aspx

Questions connexes