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?

Foi útil?

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

Uma nota interessante sobre a "maldade" de ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top