2009-04-21 2 views
12

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

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

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

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

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

ответ

6

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

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

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

+2

Операция четко определена. Это описано в [GetOverlappedResult] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683209.aspx). Это может быть обескуражено из-за того, как оно реализовано, и может быть не совсем полезно. Есть лучшие варианты. Однако он четко определен. – IInspectable

7

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

Ожидание файла обрабатывать

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

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

Вы также можете использовать 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

Смежные вопросы