WaitForSingleObject em um identificador de arquivo?
Pergunta
O que acontece quando você chamar WaitForSingleObject()
em uma alça que você criou com CreateFile()
ou _get_osfhandle()
?
Por razões não vale a pena explicar que eu gostaria de usar WaitForSingleObject()
que esperar em uma alça que eu criei com _get_osfhandle(fd)
, onde fd
vem de uma chamada regular para _open()
. Isso é possível?
Eu tentei isso na prática, e em algumas máquinas que funciona como esperado (o identificador é sempre no estado sinalizado porque você pode ler mais dados a partir dele), e em algumas máquinas WaitForSingleObject()
irá bloquear indefinidamente se você deixá-lo.
A página MSDN para WaitForSingleObject()
diz que as coisas só suportados que ele lida são "notificações de alteração, console de entrada, eventos, notificações de recursos de memória, mutex, processos, semáforos, segmentos e temporizadores waitable."
Além disso, seria diferente se eu usasse CreateFile()
vez de _get_osfhandle()
em um descritor de arquivo CRT?
Solução
Não faça isso. Como você pode ver, ele tem um comportamento indefinido.
Mesmo quando o comportamento é definido, é definida de tal forma a que seja relativamente não é útil a menos que você não gosta de escrever código adicional. Ele é sinalizado quando qualquer operação de I / O assíncrona em que completa punho, que não generalizar para rastreamento que operação E / S concluída.
Por que você está tentando esperar por um identificador de arquivo? Claramente os assuntos intenção quando você está fazendo algo que nem sequer é suportado bem o suficiente para não bloquear indefinidamente.
Outras dicas
Eu encontrei os seguintes links. O consenso parece-me, não fazê-lo.
À espera de um identificador de arquivo
Quando uma operação de I / O é iniciado em um alça assíncrona, a alça vai para um estado não-sinalizado. Portanto, quando utilizado no contexto de um WaitForSingleObject ou operação WaitForMultipleObjects, o identificador de arquivo ficará sinalizado quando as conclui operação de I / O. Contudo, Microsoft desencoraja activamente este técnica; não generalizar se existe mais de um pendente I / O Operação; a alça se tornaria sinalizado se qualquer operação de I / O completou. Portanto, embora este técnica é viável, não é melhores práticas consideradas.
em uso ReadDirectoryChangesW Modo sobreposta. WaitForSingleObject pode esperar no evento no struct OVERLAPPED.
Você também pode usar a API WaitForSingleObject () para aguardar em um alteração de arquivo se você usar o seguinte função de notificação de mudança:
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.aspUma nota interessante sobre a "maldade" de ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx