Вопрос

Что происходит, когда ты звонишь WaitForSingleObject() на дескрипторе, который вы создали с помощью CreateFile() или _get_osfhandle()?

По причинам, не стоящим объяснения, я хотел бы использовать WaitForSingleObject() чтобы дождаться дескриптора, который я создал с помощью _get_osfhandle(fd), где fd поступает от обычного звонка в _open().Возможно ли это?

Я пробовал это на практике, и на некоторых машинах это работает так, как ожидалось (дескриптор всегда находится в сигнальном состоянии, потому что вы можете прочитать из него больше данных), а на некоторых машинах WaitForSingleObject() заблокирует на неопределенный срок, если вы это позволите.

Страница MSDN для WaitForSingleObject() говорит, что единственными поддерживаемыми функциями, которые он обрабатывает, являются "уведомления об изменениях, консольный ввод, события, уведомления о ресурсах памяти, мьютекс, процессы, семафоры, потоки и ожидаемые таймеры".

Кроме того, было бы иначе, если бы я использовал CreateFile() вместо того , чтобы _get_osfhandle() в файловом дескрипторе CRT?

Это было полезно?

Решение

Не делай этого.Как вы можете видеть, он имеет неопределенное поведение.

Даже когда поведение определено, оно определено таким образом, чтобы быть относительно бесполезным, если только вам не нравится писать дополнительный код.Он сигнализируется при завершении любой асинхронной операции ввода-вывода с этим дескриптором, что не приводит к отслеживанию того, какая операция ввода-вывода завершена.

Почему вы пытаетесь дождаться дескриптора файла?Очевидно, что намерение имеет значение, когда вы делаете что-то, что даже не поддерживается достаточно хорошо, чтобы не блокировать на неопределенный срок.

Другие советы

Я нашел следующие ссылки.По общему мнению, мне кажется, не делай этого.

Ожидание дескриптора файла

Когда операция ввода-вывода запускается на асинхронном дескрипторе, дескриптор переходит в состояние без сигнализации.Следовательно, при использовании в контексте операции WaitForSingleObject или WaitForMultipleObjects дескриптор файла получит сигнал, когда операция ввода-вывода завершится.Однако, Microsoft активно препятствует этому метод;это не обобщает, если существует более одного ожидающего ввода-вывода операция;дескриптор станет сигнализироваться, если какая-либо операция ввода-вывода завершена.Следовательно, хотя этот метод осуществим, он не является считается наилучшей практикой.

Используйте ReadDirectoryChangesW в режиме перекрытия.WaitForSingleObject может ожидать события в ПЕРЕКРЫВАЮЩЕЙСЯ структуре.

Вы также можете использовать API WaitForSingleObject() для ожидания изменения файла , если вы используете следующую функцию уведомления об изменении:
Найдите firstchangenotification()
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

Интересное замечание о "зловредности" ReadDirectoryChangesW:
http://blogs.msdn.com/ericgu/archive/2005/10/07/478396.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top