WaitForSingleObject для дескриптора файла? - PullRequest
14 голосов
/ 22 апреля 2009

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

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 22 апреля 2009

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

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

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

Использовать ReadDirectoryChangesW в перекрытый режим. WaitForSingleObject можно ждать события в Перекрытая структура.

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

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

7 голосов
/ 22 апреля 2009

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

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

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

...